Срез поведения структур

Когда мы объявляем срез структур, но устанавливаем тип данных как указатель на структуру, происходит ли автоматическое преобразование литералов в указатели?

type book struct {
    id int
    name string
}

var books = []*book {
    {1, "Yellow moon"}, // ---> Is this a pointer to book OR just book
}

3 ответа

Решение

Можно определить с типом и без типа:

https://play.golang.org/p/CB2MDPDztrc

Это будет указатель на book, такой же как &book{1, "Yellow moon"}, но спецификация позволяет опустить тип и & оператор, потому что это очевидно из типа.

var books = []*book {
    {1, "Yellow moon"},  // This is the same as &book{1, "Yellow moon"}
}

Спецификация: Составные литералы:

Внутри составного литерала типа массива, фрагмента или карты T, элементы или ключи карты, которые сами по себе являются составными литералами, могут исключать соответствующий тип литерала, если он идентичен элементу или типу ключа T. Точно так же элементы или ключи, которые являются адресами составных литералов, могут опускать&T когда тип элемента или ключа *T.

[][]Point{{{0, 1}, {1, 2}}}  // same as [][]Point{[]Point{Point{0, 1}, Point{1, 2}}}

[2]*Point{{1.5, -3.5}, {}}   // same as [2]*Point{&Point{1.5, -3.5}, &Point{}}

Does go auto convert composite literals inside a slice to pointers if I declare the slice as a pointer to a struct?

это поведение указателя на структуру по умолчанию

Чтобы получить доступ к полю X структуры, когда у нас есть указатель структуры p, мы могли бы написать (*p).X. Однако эта нотация громоздка, поэтому язык позволяет нам вместо этого писать просто pX без явного разыменования.

https://tour.golang.org/moretypes/4

Другие вопросы по тегам