Тип int32
является предварительно объявленным типом, у него нет методов. Проверять:
fmt.Println(reflect.TypeOf(int32(0)).NumMethod()) // Prints 0
Вы можете ссылаться на все встроенные поля, используя неполное имя типа в качестве имени поля (Спецификация: типы структур), предварительно объявленные типы не являются исключением. См. этот пример:
u := User{3, "Bob"}
fmt.Printf("%#v\n", u)
u.int32 = 4
fmt.Println(u.int32)
Вывод (попробуйте на Go Playground):
main.User{int32:3, Name:"Bob"}
4
Основным преимуществом использования встраивания является:
методы встроенного типа продвигаются, поэтому проще реализовать интерфейсы (вам не нужно предоставлять методы, которые продвигаются)
вы можете «переопределить» методы встроенного типа (по типу встраивания): предоставьте свою собственную реализацию, которая будет вызываться при использовании значения вашего типа встраивания.
и поля встроенного типа продвигаются вперед, поэтому код короче для ссылки на продвигаемые поля (имя поля опущено).
Встраивая предварительно объявленные типы, такие как int32
, вы не получаете никаких преимуществ по сравнению с использованием обычного поля (именованного, а не встроенного поля), поскольку тип int32
не имеет методов или полей.
Забегая вперед, помимо того, что у вас нет никакого преимущества, у вас есть еще и недостаток. Поскольку имена предварительно объявленных типов начинаются с букв нижнего регистра, их встраивание неявно делает их неэкспортируемыми, поэтому вы можете ссылаться на них только в объявлении пакета типа встраивания. Если вы сделаете их обычными, именованными полями, вы можете использовать имя в верхнем регистре, чтобы оно экспортировалось, или имя в нижнем регистре, чтобы сделать его неэкспортируемым.
person
icza
schedule
07.08.2016
if user > 0 ...
например. Если бы у примитива были методы, они бы тоже продвигались. - person eduncan911   schedule 07.08.2016u > int32(0)
приводит кinvalid operation: u > int32(0) (mismatched types User and int32)
- person icza   schedule 07.08.2016