пятница, 7 июня 2019 г.

Спецификация Go: утверждения типа (type assertions)

Для выражения 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. В этом случае не возникает паника во время выполнения.


Читайте также:


Комментариев нет:

Отправить комментарий