Goでは、struct
値またはそのスライスを返すさまざまな方法があります。私が見た個々のものについて:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
これらの違いを理解しています。1つ目は構造体のコピーを返し、2つ目は関数内で作成された構造体値へのポインタ、3つ目は既存の構造体が渡されることを期待して値をオーバーライドします。
これらのパターンのすべてがさまざまなコンテキストで使用されるのを見てきましたが、これらに関するベストプラクティスは何なのでしょうか。どちらを使用しますか?たとえば、最初のものは小さな構造体で問題がなく(オーバーヘッドが最小限であるため)、2つ目はより大きな構造体で問題ありません。また、呼び出し間で単一の構造体インスタンスを簡単に再利用できるため、非常にメモリ効率を高めたい場合は3番目。どれを使用するかについてのベストプラクティスはありますか?
同様に、スライスに関する同じ質問:
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} }
}
ここでも、ベストプラクティスは何ですか。スライスは常にポインタであることを知っているので、スライスへのポインタを返すことは役に立ちません。しかし、構造体の値のスライス、構造体へのポインターのスライスを返す必要がありますか?スライスへのポインターを引数として渡す必要がありますか(Go App Engine APIで使用されるパターン)?
new(MyStruct)
:)の使用について言及しませんでしたが、実際には、ポインタを割り当てて返す方法の違いはありません。