В 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} }
}
Опять же: каковы лучшие практики здесь. Я знаю, что срезы - это всегда указатели, поэтому возвращать указатель на срез не нужно. Однако должен ли я возвращать фрагмент структурных значений, фрагмент указателей на структуры, должен ли я указывать указатель на фрагмент в качестве аргумента (шаблон, используемый в API Go App Engine )?
new(MyStruct)
:) Но на самом деле нет никакой разницы между различными методами распределения указателей и их возврата.