Один из них возникает, когда вы хотите создать экземпляр открытого типа, определенный во внешнем пакете, и этот тип встраивает другие частные типы.
Пример:
package animals
type otherProps{
Name string
Width int
}
type Duck{
Weight int
otherProps
}
Как сделать вы создаете экземпляр Duck
в своей собственной программе? Вот лучшее, что я мог бы придумать:
package main
import "github.com/someone/animals"
func main(){
var duck animals.Duck
// Can't instantiate a duck with something.Duck{Weight: 2, Name: "Henry"} because `Name` is part of the private type `otherProps`
duck.Weight = 2
duck.Width = 30
duck.Name = "Henry"
}
enum
, как только гарантируют, будет достаточно большим для содержания int
значения. Компилятор является бесплатным выбрать фактический тип, используемый на основе констант перечисления, определенных, таким образом, он может выбрать меньший тип, если он может представить значения, Вы определяете. При необходимости в константах перечисления, которые не вписываются int
, необходимо будет использовать определенные для компилятора расширения, чтобы сделать так.
Взятый из текущего Стандарта C (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.7.2.2 спецификатора Перечисления
[...]
Ограничения
выражение, которое определяет значение постоянного перечисления, должно быть выражением целочисленной константы, которое имеет значение, представимое как интервал
[...]
, Каждый перечислимый тип должен быть совместим с символом, типом целого числа со знаком или типом беззнаковых целых чисел. Выбор типа определяется реализацией, но должен быть способен к представлению значений всех участников перечисления.
Не то, чтобы компиляторы хорошо работают в следующем стандарт, но по существу: Если Ваше перечисление содержит что-либо еще, чем интервал, Вы находитесь в глубоком "неподдерживаемом поведении, которое может возвратиться, кусая Вас через год или две" территории.