Ответ 1
Это утверждение типа. Утверждение типа может использоваться для:
- получить значение конкретного типа из значения типа интерфейса
- или для получения значения типа интерфейса, отличного от исходного (интерфейс с другим набором методов, практически не подмножество исходного, поскольку это можно было просто получить с помощью простого преобразования типов).
Цитирую из спецификации:
Для выражения
x
типа интерфейса и типаT
основное выражениеx.(T)
утверждает, что
x
не равенnil
и что значение, хранящееся вx
имеет типT
Обозначениеx.(T)
называется утверждением типа.Точнее, если
T
не является типом интерфейса,x.(T)
утверждает, что динамический типx
идентичен типуT
В этом случаеT
должен реализовать тип (interface)x
; в противном случае утверждение типа недопустимо, посколькуx
может сохранить значение типаT
ЕслиT
является типом интерфейса,x.(T)
утверждает, что динамический типx
реализует интерфейсT
Точнее, ваш пример - это особая форма, которая также сообщает, имеет ли место утверждение типа. Если нет, то ok
будет false
, а если утверждение выполнено, ok
будет true
.
Эта специальная форма никогда не паникует в отличие от формы:
paxPayment = dataObject.(*entities.PassengerPayment)
Который, если dataObject
не содержит значение типа *entities.PassengerPayment
dataObject
будет паниковать.