У 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 API App Engine )?
new(MyStruct)
:) Але насправді немає різниці між різними методами розподілу покажчиків та їх повернення.