In Go gibt es verschiedene Möglichkeiten, einen struct
Wert oder einen Slice 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 der Struktur zurück, der zweite einen Zeiger auf den innerhalb der Funktion erstellten Strukturwert, der dritte erwartet, dass eine vorhandene Struktur übergeben wird, und überschreibt den Wert.
Ich habe gesehen, dass all diese Muster in verschiedenen Kontexten verwendet werden. Ich frage mich, welche Best Practices diesbezüglich gelten. Wann würden Sie welche verwenden? Zum Beispiel könnte die erste für kleine Strukturen in Ordnung sein (weil der Overhead minimal ist), die zweite für größere. Und die dritte, wenn Sie extrem speichereffizient sein möchten, da Sie eine einzelne Strukturinstanz zwischen Aufrufen problemlos wiederverwenden können. Gibt es Best Practices für die Verwendung von welchen?
Ebenso die gleiche Frage bezüglich Scheiben:
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 Best Practices? Ich weiß, dass Slices immer Zeiger sind, daher ist es nicht sinnvoll, einen Zeiger auf ein Slice zurückzugeben. Sollte ich jedoch ein Slice mit Strukturwerten zurückgeben, ein Slice mit Zeigern auf Strukturen, sollte ich einen Zeiger auf ein Slice als Argument übergeben (ein Muster, das in der Go App Engine-API verwendet wird )?
new(MyStruct)
:) Aber es gibt keinen Unterschied zwischen den verschiedenen Methoden zum Zuweisen und Zurückgeben von Zeigern.