In Go gibt es verschiedene Möglichkeiten, einen struct
-Wert oder einen Teil davon zurückzugeben. Für einzelne habe ich gesehen:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Ich verstehe die Unterschiede zwischen diesen. Der erste gibt eine Kopie des Structs zurück, der zweite einen Zeiger auf den innerhalb der Funktion erstellten Struct-Wert, der dritte erwartet einen vorhandenen Struct, der übergeben wird und den Wert überschreibt.
Ich habe all diese Muster in verschiedenen Kontexten gesehen und frage mich, welche bewährten Verfahren es in Bezug darauf gibt. Wann würden Sie welche verwenden? Zum Beispiel könnte der erste für kleine Strukturen in Ordnung sein (weil der Overhead minimal ist), der zweite für größere. Und der dritte, wenn Sie extrem speichereffizient sein möchten, weil Sie eine einzige Struct-Instanz zwischen den Aufrufen problemlos wiederverwenden können. Gibt es bewährte Verfahren für den Einsatz von welchem?
Ebenso die gleiche Frage in Bezug auf Slices:
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} }
}
Nochmals: Was sind hier bewährte Verfahren? Ich weiß, dass Slices immer Zeiger sind, daher ist es nicht sinnvoll, einen Zeiger auf einen Slice zurückzugeben. Sollte ich jedoch ein Slice von Struct-Werten zurückgeben, ein Slice von Zeigern auf Structs, sollte ich einen Zeiger auf einen Slice als Argument übergeben (ein Muster, das in der Go App Engine API) verwendet wird?