Go'daki variadic fonksiyonlar, üç nokta ... sentaksı sayesinde tek bir türde değişken sayıda argüman almaya olanak tanır. Örneğin:
func sum(nums ...int) int { total := 0 for _, num := range nums { total += num } return total }
Bu tür bir fonksiyonu herhangi bir argüman sayısıyla çağırabilirsiniz:
result := sum(1, 2, 3, 4) // 10
Ya da dilimi ... sentaksını kullanarak geçirebilirsiniz:
numbers := []int{1,2,3} result := sum(numbers...) // 6
İnce Ayrıntılar:
[]T) olarak görünür. Yani, önceden hazırlanmış bir dilimi içeri geçirebilirsiniz.... olmadan geçirdiğinizde, fonksiyon normal bir []T türünde parametre bekler, variadic değil.Aşağıdaki kodun ne tür bir sonuç vereceğini ve nedenini söyler misiniz?
func printInts(nums ...int) { fmt.Printf("%#v ", nums) } ints := []int{1, 2, 3} printInts(ints)
Birçok kişi bu kodun derleneceğini düşünür, ancak aslında derleme hatası verecektir:
Hata: Variadic parametreye dilim geçirilmez.
Doğru:
printInts(ints...) // TAMAM
Hikaye
Büyük bir projede, bir loglama fonksiyonu func Log(msgs ...string) şeklinde tanımlandı. Önceden hazırlanmış bir string dilimi geçirerek Log(strings) çağrıldığında logda yanlış çıktı veya çalışma sırasında panic alındı. Sebep — ... eksikliği, bu nedenle fonksiyon bir []string türünde tek bir argüman alıyordu, ayrı ayrı stringler değil.
Hikaye
Bir yardımcı fonksiyonda, bir dilimi işlemek ve içerisine daha fazla eleman eklemek gerekiyordu. ...'nin dilimin bir kopyasını oluşturduğunu, referansı değil — ama fonksiyon içinde dilimi değiştirdikleri için, özellikle başlangıçtaki dilim tekrar kullanılan bir tampon ise, çağrılma tarafında beklenmedik etkilere neden oluyordu.
Hikaye
Bir geliştirici, variadic parametre kullanarak toplama fonksiyonları gerçekleştirdi, ancak bir meslektaşı çağrı sentaksını yanlış kullandı: sum(interface{}([]int)), bu da zaman içinde belirsiz hatalara neden oluyordu. Doğru olan açıkça sum(slice...) kullanmaktı. İnce ayrıntıları bilmemek, toplu yeniden yapılandırmalarda anlaşılması zor hatalara yol açıyordu.