Я собираюсь ответить на это, несмотря на мое лучшее решение просто отправить ОП в тур и документацию / спецификацию.Главным образом из-за этого:
Есть ли какая-либо разница в памяти между getDemo1 и getDemo2?
Ответ на этот конкретный вопрос зависит от того, как вы используете слайс.Go это Передача по значению , поэтому передача значений структуры вокруг копирует их.Например, рассмотрим следующий пример.
https://play.golang.org/p/VzjYXwUy0EI
d1 := getDemo1()
d2 := getDemo2()
for _, v := range d1 {
// v is of type *Demo, so this modifies the value in the slice
v.s = "same"
}
fmt.Println(d1)
for _, v := range d2 {
// v is of type Demo, and is a COPY of the struct in the slice, so the original is not modified
v.s = "same"
}
Что касается вопроса о памяти, очевидно, используя *Demo
, который возвращает копию указателя в диапазоне (фактически uint64
), в отличие от возврата копии Demo
(всей структуры и всех ее полей), будет использовать меньше памяти. НО , вы все равно можете индексировать непосредственно в массив, чтобы избежать копий, за исключением случаев, когда вы передаете отдельные элементы в срез.
Тем не менее, передавая сам срез, эти два типа не имеют разницы в накладных расходах.Срез - это абстракция массива, а сам срез, который передается, является просто заголовком среза, который будет иметь одинаковый объем памяти, независимо от того, какой тип содержит срез.
Кстати, парадигма для изменениязначения в случае []Demo
это:
for i, _ := range d2 {
d2[i].s = "same"
}