GoDasturchi
Type Parameters: Writing Generic Functions

Type Parameters: Writing Generic Functions

Tur parametrlari: umumiy (generic) funksiyalar yozish

YAML Data Pipeline kursida TransformRows, GroupByCategory kabi funksiyalarni faqat Product turi bilan ishlaydigan qilib yozdingiz. Agar bir xil mantiqni boshqa turlar bilan ham qayta ishlatmoqchi bo'lsangiz-chi? Generic (umumiy) funksiyalar — kvadrat qavs ichidagi tur parametri yordamida bir marta yozib, ko'plab turlar bilan ishlatish imkonini beradi.

example.go
func MapSlice[T, U any](items []T, f func(T) U) []U {
    result := make([]U, len(items))
    for i, item := range items {
        result[i] = f(item)
    }
    return result
}

[T, U any] — bu ikkita tur parametri e'lon qiladi: T (kiruvchi elementlar turi) va U (natija elementlari turi). any — bu yerda cheklov (constraint): "T va U mutlaqo har qanday tur bo'lishi mumkin" degani. Chaqirganda turlarni yozish shart emas — Go ularni argumentlardan avtomatik chiqarib oladi (type inference):

example.go
doubled := MapSlice(nums, func(n int) int { return n * 2 })
// Go T=int, U=int ekanini o'zi aniqlaydi

>_ Exercise

MapSlice[T, U any](items []T, f func(T) U) []U generic funksiyasini yozing. U itemsning har bir elementiga f funksiyasini qo'llab, natijalarni yangi []U slice'iga yig'ib qaytaradi.

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Generic funksiya kvadrat qavs ichida tur parametrlarini ([T, U any]) e'lon qiladi — bu funksiya tanasida haqiqiy turlar o'rniga ishlatiladigan "o'rinbosar" turlardir. Chaqirish vaqtida Go turlarni argumentlardan avtomatik chiqarib oladi, shuning uchun kod chaqiruvchi tomonda oddiy funksiyadan farq qilmaydi.

NEXT UP

Constraints: Limiting What Types Are Allowed

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Type Parameters: Writing Generic Functions

Tur parametrlari: umumiy (generic) funksiyalar yozish

YAML Data Pipeline kursida TransformRows, GroupByCategory kabi funksiyalarni faqat Product turi bilan ishlaydigan qilib yozdingiz. Agar bir xil mantiqni boshqa turlar bilan ham qayta ishlatmoqchi bo'lsangiz-chi? Generic (umumiy) funksiyalar — kvadrat qavs ichidagi tur parametri yordamida bir marta yozib, ko'plab turlar bilan ishlatish imkonini beradi.

example.go
func MapSlice[T, U any](items []T, f func(T) U) []U {
    result := make([]U, len(items))
    for i, item := range items {
        result[i] = f(item)
    }
    return result
}

[T, U any] — bu ikkita tur parametri e'lon qiladi: T (kiruvchi elementlar turi) va U (natija elementlari turi). any — bu yerda cheklov (constraint): "T va U mutlaqo har qanday tur bo'lishi mumkin" degani. Chaqirganda turlarni yozish shart emas — Go ularni argumentlardan avtomatik chiqarib oladi (type inference):

example.go
doubled := MapSlice(nums, func(n int) int { return n * 2 })
// Go T=int, U=int ekanini o'zi aniqlaydi

>_ Exercise

MapSlice[T, U any](items []T, f func(T) U) []U generic funksiyasini yozing. U itemsning har bir elementiga f funksiyasini qo'llab, natijalarni yangi []U slice'iga yig'ib qaytaradi.

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Generic funksiya kvadrat qavs ichida tur parametrlarini ([T, U any]) e'lon qiladi — bu funksiya tanasida haqiqiy turlar o'rniga ishlatiladigan "o'rinbosar" turlardir. Chaqirish vaqtida Go turlarni argumentlardan avtomatik chiqarib oladi, shuning uchun kod chaqiruvchi tomonda oddiy funksiyadan farq qilmaydi.

NEXT UP

Constraints: Limiting What Types Are Allowed