GoDasturchi
Custom Type Constraints

Custom Type Constraints

Maxsus tur cheklovlari

Type Constraints darsida Numberni int | 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 cheklovida ishlatiladigan aynan shu naqsh.

>_ 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

Generic Interfaces

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Custom Type Constraints

Maxsus tur cheklovlari

Type Constraints darsida Numberni int | 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 cheklovida ishlatiladigan aynan shu naqsh.

>_ 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

Generic Interfaces