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 main23import "fmt"45func Max[T int | float64](a, b T) T {6if a > b {7return a8}9return b10}1112func main() {13fmt.Println(Max(10, 20)) // 2014fmt.Println(Max(3.5, 2.1)) // 3.515}Çıktı:
12023.5Burada 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 main23import "fmt"45func Contains[T comparable](slice []T, item T) bool {6for _, v:= range slice {7if v == item {8return true9}10}11return false12}1314func main() {15fmt.Println(Contains([]int{1, 2, 3}, 2)) // true16fmt.Println(Contains([]string{"a", "b"}, "c")) // false17}Çıktı:
1true2falsecomparable constraint, eşitlik kontrolü yapılabilen tüm türleri kabul eder.
Struct'lar da generic olabilir.
1package main23import "fmt"45type Box[T any] struct {6Value T7}89func (b Box[T]) Get() T {10return b.Value11}1213func main() {14intBox:= Box[int]{Value: 42}15strBox:= Box[string]{Value: "merhaba"}1617fmt.Println(intBox.Get()) // 4218fmt.Println(strBox.Get()) // merhaba19}Çıktı:
1422merhaba[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
5 yorum
constraintler başta garip gelir ama aslında bence basit ya herhangi bir tür demek ama int
iyi hoş ama constraintler biraz kafası karışık başta int | float64 dediğin zaman başka
hocam bir şey değişti ya şimdi bir fonksiyon yazıyorsun bir kez çalışıyor herkes için o
aynen o copy paste günleri düşünüyorum da acı çekiyorum bir şey değişti mi hepsini
kodu bir kez yazıp her yerde kullanmak gerçekten rahat eskiden copy paste cehennemiydi