In Vai ci sono vari modi per restituire un struct
valore o una sua porzione. Per quelli individuali che ho visto:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Capisco le differenze tra questi. Il primo restituisce una copia della struttura, il secondo un puntatore al valore della struttura creato all'interno della funzione, il terzo si aspetta che una struttura esistente venga passata e sovrascrive il valore.
Ho visto tutti questi schemi essere usati in vari contesti, mi chiedo quali siano le migliori pratiche in merito. Quando useresti quale? Ad esempio, il primo potrebbe andare bene per le piccole strutture (perché il sovraccarico è minimo), il secondo per quelle più grandi. E il terzo se si desidera essere estremamente efficienti in termini di memoria, perché è possibile riutilizzare facilmente una singola istanza di struttura tra le chiamate. Ci sono delle migliori pratiche per quando usare quali?
Allo stesso modo, la stessa domanda per quanto riguarda le sezioni:
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} }
}
Ancora: quali sono le migliori pratiche qui. So che le sezioni sono sempre dei puntatori, quindi restituire un puntatore a una fetta non è utile. Tuttavia, dovrei restituire una porzione di valori di struttura, una fetta di puntatori a strutture, dovrei passare un puntatore a una fetta come argomento (un modello utilizzato nell'API del motore dell'app Go )?
new(MyStruct)
:) Ma in realtà non vi è alcuna differenza tra i diversi metodi di allocazione dei puntatori e di restituzione.