Union Constraints: Combining Multiple Types
Union cheklovlar: bir nechta turni birlashtirish
Constraints darsida Numberni int | int64 | float64 sifatida aniqladingiz. Bu ishlaydi, lekin bitta cheklovi bor: agar kimdir type Celsius float64 kabi o'z turini aniqlasa, u Numberga mos kelmaydi — chunki uning asosiy (underlying) turi float64 bo'lsa ham, o'zi float64 emas.
Yechim — ~ (tilda) belgisi: "bu turning o'zi emas, balki asosiy turi shu bo'lgan har qanday tur" degani:
type Ordered interface {
~int | ~int64 | ~float64 | ~string
}
func Max[T Ordered](a, b T) T {
if a > b {
return a
}
return b
}Endi Max nafaqat oddiy int, float64, string bilan, balki ularning asosida qurilgan har qanday maxsus turlar (type Celsius float64, type UserID int) bilan ham ishlaydi. Bu standart kutubxonaning cmp.Ordered konstraint'ida ishlatiladigan aynan shu naqsh — slices.Sort kabi funksiyalar shu tufayli juda ko'p turlar bilan ishlay oladi.
>_ Exercise
~int, ~int64, ~float64 va ~stringni o'z ichiga olgan Ordered cheklov interfeysini aniqlang. Max[T Ordered](a, b T) T funksiyasini yozing — u ikkita qiymatdan kattasini qaytaradi (> operatoridan foydalaning).
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
~T — cheklov ichida "asosiy turi T bo'lgan har qanday tur" degani, oddiy Tdan farqli o'laroq (faqat aynan Tning o'zi). Bu generic funksiyalarni standart turlar ustiga qurilgan maxsus turlar bilan ham ishlaydigan qiladi.
NEXT UP
Multiple Type Parameters
$ go run main.go
Kodingizni ishga tushiring