Constraints: Limiting What Types Are Allowed
Cheklovlar: qaysi turlarga ruxsat berishni belgilash
any — eng keng cheklov: mutlaqo har qanday tur mos keladi. Lekin ba'zida funksiyangiz ma'lum amallarni (masalan, + bilan qo'shishni) talab qiladi, va any bunga imkon bermaydi — Go any turidagi ikkita qiymatni qo'shishga ruxsat bermaydi, chunki ular umuman qo'shilishi mumkin bo'lgan turmi ekanini bilmaydi.
Yechim — maxsus cheklov interfeysi: ruxsat etilgan turlarni | bilan sanab o'tadigan interfeys.
type Number interface {
int | int64 | float64
}
func Sum[T Number](nums []T) T {
var total T
for _, n := range nums {
total += n
}
return total
}Endi Sum faqat Number ro'yxatidagi turlar bilan chaqirilishi mumkin, va funksiya ichida += ishlatish xavfsiz — Go har uchala tur ham qo'shish amalini qo'llab-quvvatlashini biladi. var total T — Pointers & Memory kursidagi nol qiymat g'oyasining generic versiyasi: T qanday tur bo'lishidan qat'i nazar, total o'sha turning nol qiymati bilan boshlanadi (int uchun 0, float64 uchun 0.0).
>_ Exercise
int, int64 va float64 turlarini o'z ichiga olgan Number cheklov interfeysini aniqlang. So'ngra Sum[T Number](nums []T) T funksiyasini yozing — u slice elementlarining yig'indisini qaytaradi.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Maxsus cheklov interfeysi (type Number interface { int | int64 | float64 }) generic funksiya ichida qaysi amallar (masalan, +) xavfsiz ekanini Go'ga aytadi. any — bu "hech qanday amalga ruxsat yo'q" degan cheklov ekanini endi tushunasiz.
NEXT UP
comparable: The Equality Constraint
$ go run main.go
Kodingizni ishga tushiring