Go Generics Temeleri: Type Parameters ile Kod Tekrarını Azaltma

Go 1.18 ile dile eklenen generics, aynı işi farklı türlerle yapan kodun tekrarını ortadan kaldırır. Type parameters sayesinde bir kez yazıp birden fazla türde kullanabilirsiniz.

Generics olmadan, farklı türler için aynı fonksiyonu tekrar tekrar yazmanız gerekir. Örneğin int ve string için ayrı ayrı Max fonksiyonu yazmalısınız. Generics ile bunu bir kez yazıp tüm türlerde kullanabilirsiniz.

Type parameter köşeli parantez içinde tanımlanır. [T] demek "herhangi bir tür" anlamına gelir.

1package main
2
3import "fmt"
4
5func Max[T int | float64](a, b T) T {
6if a > b {
7return a
8}
9return b
10}
11
12func main() {
13fmt.Println(Max(10, 20)) // 20
14fmt.Println(Max(3.5, 2.1)) // 3.5
15}

Çıktı:

120
23.5

Burada T int | float64 demek "T, int veya float64 olabilir" anlamına gelir. Go türü otomatik olarak çıkarır.

Constraint'ler hangi türlerin kullanılabileceğini belirler. comparable gibi yerleşik constraint'ler vardır.

1package main
2
3import "fmt"
4
5func Contains[T comparable](slice []T, item T) bool {
6for _, v:= range slice {
7if v == item {
8return true
9}
10}
11return false
12}
13
14func main() {
15fmt.Println(Contains([]int{1, 2, 3}, 2)) // true
16fmt.Println(Contains([]string{"a", "b"}, "c")) // false
17}

Çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1true
2false

comparable constraint, eşitlik kontrolü yapılabilen tüm türleri kabul eder.

Struct'lar da generic olabilir.

1package main
2
3import "fmt"
4
5type Box[T any] struct {
6Value T
7}
8
9func (b Box[T]) Get() T {
10return b.Value
11}
12
13func main() {
14intBox:= Box[int]{Value: 42}
15strBox:= Box[string]{Value: "merhaba"}
16
17fmt.Println(intBox.Get()) // 42
18fmt.Println(strBox.Get()) // merhaba
19}

Çıktı:

142
2merhaba

[T any] demek "T herhangi bir tür olabilir" anlamına gelir.

  • Type parameters [T] ile tanımlanır
  • Constraints hangi türlerin kullanılacağını sınırlar
  • Fonksiyonlar ve struct'lar generic olabilir
  • Kod tekrarını azaltır, tip güvenliğini korur

Generics, Go'da daha temiz ve yeniden kullanılabilir kod yazmanın anahtarıdır.

---

bknz: Embedding ile Composition: Go'da Kod Tekrarını Gerçekten Azaltıyor mu

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • adlı kullanıcıya yanıt verdi
    birkahvebirben

    constraintler başta garip gelir ama aslında bence basit ya herhangi bir tür demek ama int

  • adlı kullanıcıya yanıt verdi
    kodkafasi

    iyi hoş ama constraintler biraz kafası karışık başta int | float64 dediğin zaman başka

  • adlı kullanıcıya yanıt verdi
    birkahvebirben

    hocam bir şey değişti ya şimdi bir fonksiyon yazıyorsun bir kez çalışıyor herkes için o

  • adlı kullanıcıya yanıt verdi
    kodkafasi

    aynen o copy paste günleri düşünüyorum da acı çekiyorum bir şey değişti mi hepsini

  • birkahvebirben

    kodu bir kez yazıp her yerde kullanmak gerçekten rahat eskiden copy paste cehennemiydi