В Go есть различные способы вернуть значение struct
или его фрагмент. Для отдельных я видел:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Я понимаю различия между ними. Первый возвращает копию структуры, второй - указатель на значение структуры, созданное внутри функции, третий ожидает, что существующая структура будет передана и переопределит значение.
Я видел, как все эти шаблоны использовались в разных контекстах, мне интересно, какие лучшие практики касаются этих. Когда вы будете использовать это? Например, первая может быть хорошо для небольших структур (потому что накладные расходы минимальны), второй для больших. И третий, если вы хотите быть чрезвычайно эффективной с точки зрения памяти, потому что вы можете легко повторно использовать один экземпляр структуры между вызовами. Существуют ли какие-либо рекомендации по использованию, которые следует использовать?
Аналогично, тот же вопрос относительно срезов:
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} }
}
Снова: какие лучшие практики здесь. Я знаю, что срезы всегда являются указателями, поэтому возврат указателя на фрагмент не полезен. Однако, если я должен вернуть фрагмент значений структуры, кусок указателей на структуры, должен ли я передать указатель на срез в качестве аргумента (шаблон, используемый в Go API App Engine)?