Для выражения х типа интерфейса и типа Т, первичного выражения
x.(T)
утверждает, что х не ноль, а значение, хранящееся в x имеет значение тип T. Обозначение x. (T) называется утверждением типа.
Более точно, если Т не является типом интерфейса, х. (Т) утверждает, что динамического типа х идентичен типу T. В этом случае Т должен осуществить тип (интерфейс) х ; в противном случае утверждение типа недействительно, так как невозможно сохранить значение типа T. Если T является типом интерфейса, x. (T) утверждает, что динамический тип x реализует интерфейс T.
Если утверждение типа имеет значение, значение выражения представляет собой значение , хранящееся в x, а его тип - T. Если утверждение типа ложно, происходит паника во время выполнения. Другими словами, хотя динамический тип x известен только во время выполнения, тип x. (T) известен как T в правильной программе .
var x interface{} = 7 // x has dynamic type int and value 7
i := x.(int) // i has type int and value 7
type I interface { m() }
var y I
s := y.(string) // illegal: string does not implement I (missing method m)
r := y.(io.Reader) // r has type io.Reader and y must implement both I and io.Reader
Тип утверждение используется в назначении или инициализации специальной формы
v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)
дает дополнительное нетипизированное логическое значение. Значение ok является истинным, если утверждение выполнено. В противном случае это значение false, а значение v является нулевым значением для типа T. В этом случае не происходит паники во время выполнения.
Проверить это https://golang.org/doc/effective_go.html#interface_conversions –
это удобный способ получить конкретный тип, который реализует интерфейс. это утверждение типа. интерфейс {} может принимать любой тип, в этом случае, если этот тип является [] байтом, тогда он будет назначен «байтам», а «ok» укажет, что это тот тип, то есть ok - это bool. проверьте это https://golang.org/ref/spec#Type_assertions – Snowman