Для выражения x типа интерфейса и типа T первичное выражение
x.(T)
утверждает, что x не равен nil и что значение, хранящееся в x, имеет тип T. Обозначение x.(T) называется утверждением типа (type assertion).
Точнее, если T не является интерфейсным типом, x.(T) утверждает, что динамический тип x идентичен типу T. В этом случае T должен реализовать (interface) тип x; в противном случае утверждение типа недопустимо, поскольку для x невозможно сохранить значение типа T. Если T является типом интерфейса, x.(T) утверждает, что динамический тип x реализует интерфейс T.
Если утверждение типа выполнено, значением выражения является значение, сохраненное в x, а его типом является T. Если утверждение типа равно false, возникает паника во время выполнения. Другими словами, даже если динамический тип x известен только во время выполнения, тип x.(T) известен как T в правильной программе.
var x interface{} = 7 // x имеет динамический тип int и значение 7
i := x.(int) // i имеет тип int и значение 7
type I interface { m() }
func f(y I) {
s := y.(string) // недопустимо: string не реализует I (пропущен метод m)
r := y.(io.Reader) // r имеет тип io.Reader и динамический тип y должен реализовывать оба I и io.Reader
…
}
Утверждение типа, используемое в присваивании или инициализации специальной формы
v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)
var v, ok T1 = x.(T)
дает дополнительное нетипизированное логическое значение. Значение ok равно true, если утверждение верно. В противном случае оно равно false, а значение v является нулевым значением для типа T. В этом случае не возникает паника во время выполнения.
Читайте также:
- Спецификация Go: объявление типа
- Спецификация Go: первичные выражения (primary expressions), селекторы (selectors)
- Спецификация Go: выражения (expressions) - операнды, квалифицированные идентификаторы
Комментариев нет:
Отправить комментарий