Go'da bir struct
değeri veya dilimini döndürmenin çeşitli yolları vardır . Bireysel olanlar için gördüm:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Bunlar arasındaki farkları anlıyorum. Birincisi yapının bir kopyasını döndürür, ikincisi işlev içinde oluşturulan yapı değerine bir işaretçi, üçüncüsü var olan bir yapının aktarılmasını bekler ve değeri geçersiz kılar.
Tüm bu modellerin çeşitli bağlamlarda kullanıldığını gördüm, bunlarla ilgili en iyi uygulamaların ne olduğunu merak ediyorum. Hangisini ne zaman kullanırsın? Örneğin, birincisi küçük yapılar için iyi olabilir (çünkü havai minimum), ikincisi daha büyük olanlar için. Ve üçüncüsü, bellekte son derece verimli olmak istiyorsanız, çağrılar arasında tek bir yapı örneğini kolayca yeniden kullanabilirsiniz. Hangisini kullanacağınız için en iyi uygulamalar var mı?
Benzer şekilde, dilimlerle ilgili aynı soru:
func myfunc() []MyStruct {
return []MyStruct{ MyStruct{Val: 1} }
}
func myfunc() []*MyStruct {
return []MyStruct{ &MyStruct{Val: 1} }
}
func myfunc(s *[]MyStruct) {
*s = []MyStruct{ MyStruct{Val: 1} }
}
func myfunc(s *[]*MyStruct) {
*s = []MyStruct{ &MyStruct{Val: 1} }
}
Tekrar: burada en iyi uygulamalar nelerdir. Dilimleri her zaman işaretçiler olduğunu biliyorum, bu yüzden bir dilime bir işaretçi döndürmek yararlı değildir. Ancak, bir dilim yapı değerleri, bir dilim işaretçi yapıları döndürmek gerekir, bir işaretçiyi bir dilim argüman olarak ( Go App Engine API kullanılan desen) iletmek gerekir ?
new(MyStruct)
:) Ama gerçekten işaretçi ayırma ve onları döndürme farklı yöntemler arasında hiçbir fark yoktur.