В чем разница между [] struct {} и [] * struct {}? - PullRequest
0 голосов
/ 27 сентября 2018

В чем разница ниже?

type Demo struct {s string}

func getDemo1()([]*Demo)  // 1

func getDemo2()([]Demo)  // 2

Есть ли разница в памяти между getDemo1 и getDemo2?

1 Ответ

0 голосов
/ 27 сентября 2018

Я собираюсь ответить на это, несмотря на мое лучшее решение просто отправить ОП в тур и документацию / спецификацию.Главным образом из-за этого:

Есть ли какая-либо разница в памяти между 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"
}
...