GoDasturchi
Union Constraints: Combining Multiple Types

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:

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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:

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

Hints (0/3)

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