No Go, existem várias maneiras de retornar um struct
valor ou fatia dele. Para os individuais que eu já vi:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Eu entendo as diferenças entre estes. O primeiro retorna uma cópia da estrutura, o segundo um ponteiro para o valor da estrutura criado na função, o terceiro espera que uma estrutura existente seja passada e substitui o valor.
Já vi todos esses padrões serem usados em vários contextos, estou me perguntando quais são as melhores práticas em relação a eles. Quando você usaria qual? Por exemplo, o primeiro pode ser aprovado para estruturas pequenas (porque a sobrecarga é mínima), o segundo para estruturas maiores. E a terceira, se você deseja ser extremamente eficiente em termos de memória, porque é possível reutilizar facilmente uma única instância de estrutura entre as chamadas. Existem práticas recomendadas para quando usar quais?
Da mesma forma, a mesma pergunta sobre fatias:
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} }
}
Novamente: quais são as melhores práticas aqui. Sei que as fatias são sempre ponteiros, portanto, não é útil retornar um ponteiro para uma fatia. No entanto, devo retornar uma fatia dos valores de struct, uma fatia de ponteiros para estruturas, devo passar um ponteiro para uma fatia como argumento (um padrão usado na API do Go App Engine )?
new(MyStruct)
:) Mas não há realmente nenhuma diferença entre os diferentes métodos de alocação de ponteiros e retorná-los.