En Go hay varias formas de devolver un struct
valor o una porción del mismo. Para los individuales que he 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
}
Entiendo las diferencias entre estos. El primero devuelve una copia de la estructura, el segundo un puntero al valor de estructura creado dentro de la función, el tercero espera que se pase una estructura existente y anula el valor.
He visto que todos estos patrones se usan en varios contextos, me pregunto cuáles son las mejores prácticas con respecto a estos. ¿Cuándo usarías cuál? Por ejemplo, el primero podría estar bien para estructuras pequeñas (porque la sobrecarga es mínima), el segundo para las más grandes. Y el tercero si desea ser extremadamente eficiente en la memoria, porque puede reutilizar fácilmente una sola instancia de estructura entre llamadas. ¿Hay alguna práctica recomendada para cuándo usar cuál?
Del mismo modo, la misma pregunta con respecto a las rebanadas:
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} }
}
De nuevo: ¿cuáles son las mejores prácticas aquí? Sé que los sectores siempre son punteros, por lo que devolver un puntero a un sector no es útil. Sin embargo, ¿debería devolver una porción de valores de estructura, una porción de punteros a estructuras, debería pasar un puntero a una porción como argumento (un patrón utilizado en la API de Go App Engine )?
new(MyStruct)
:) Pero en realidad no hay diferencia entre los diferentes métodos para asignar punteros y devolverlos.