Di Go ada berbagai cara untuk mengembalikan struct
nilai atau potongannya. Untuk individu yang pernah saya lihat:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Saya mengerti perbedaan di antara ini. Yang pertama mengembalikan salinan struct, yang kedua pointer ke nilai struct yang dibuat dalam fungsi, yang ketiga mengharapkan struct yang ada untuk diteruskan dan menimpa nilainya.
Saya telah melihat semua pola ini digunakan dalam berbagai konteks, saya bertanya-tanya apa praktik terbaik mengenai ini. Kapan Anda akan menggunakan yang mana? Misalnya, yang pertama bisa ok untuk struct kecil (karena overhead minimal), yang kedua untuk yang lebih besar. Dan yang ketiga jika Anda ingin menjadi sangat efisien dalam memori, karena Anda dapat dengan mudah menggunakan kembali instance inst tunggal di antara panggilan. Apakah ada praktik terbaik untuk kapan menggunakannya?
Demikian pula, pertanyaan yang sama tentang irisan:
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} }
}
Sekali lagi: apa praktik terbaik di sini. Saya tahu irisan selalu pointer, jadi mengembalikan pointer ke irisan tidak berguna. Namun, haruskah saya mengembalikan sepotong nilai struct, sepotong pointer ke struct, haruskah saya meneruskan sebuah pointer ke sebuah slice sebagai argumen (pola yang digunakan dalam Go App Engine API )?
new(MyStruct)
:) Tapi tidak ada perbedaan antara metode yang berbeda untuk mengalokasikan pointer dan mengembalikannya.