Срез поведения структур
Когда мы объявляем срез структур, но устанавливаем тип данных как указатель на структуру, происходит ли автоматическое преобразование литералов в указатели?
type book struct {
id int
name string
}
var books = []*book {
{1, "Yellow moon"}, // ---> Is this a pointer to book OR just book
}
3 ответа
Можно определить с типом и без типа:
Это будет указатель на 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 без явного разыменования.