ProgramlamaBackend Geliştirici

Go'da variadic fonksiyonların (değişken sayıda argüman alan fonksiyonlar) nasıl uygulandığını tanımlayın. Doğru bir şekilde nasıl tanımlanır, çağrılır ve dilimlerin geçirilmesi sırasında hangi gizli tuzaklar olabilir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Fonksiyon içindeki variadic parametreler bir dilim ([]T) olarak görünür. Yani, önceden hazırlanmış bir dilimi içeri geçirebilirsiniz.
  • Bu tür parametreler her zaman fonksiyon parametreleri listesinde son sırada olmalıdır.
  • Dilimi ... olmadan geçirdiğinizde, fonksiyon normal bir []T türünde parametre bekler, variadic değil.

Tuzak Sorusu

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

Gerçek Hata Örnekleri


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.