GoDasturchi
Constraints: Limiting What Types Are Allowed

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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