我们将此称为 “式的断言。”
这完全记录在Language Spec。为了在这里得到完整的答案(因为它是整个答案),而不是只有链接的答案,我会将它包含在规范中最相关的信息中。这是文档,而不是我的答案...
当x接口类型和类型T的表达式,主 表达
x.(T)
断言x是不是nil,并且存储的值在x中是 类型T.记号x.(T)被称为类型断言。更确切地说,如果T不是接口类型,则x(T)断言x的动态类型与类型T相同。在这种情况下,T必须执行 (x)的接口类型;否则类型断言是 无效,因为x不能存储类型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的值为真。 否则它是错误的,并且v的值是类型T的零值。 在这种情况下不会发生运行时恐慌。
有效围棋是另一个很好的资源,其中还包括在接口转换节,并键入断言: https://golang.org/doc/effective_go.html#interface_conversions
检查了这一点https://golang.org/doc/effective_go.html#interface_conversions –
它一种方便的方式来获得实现界面的具体类型。它是类型断言。 interface {}可以接受任何类型,在这种情况下,如果该类型是[] byte,那么它将被分配给'bytes','ok'将表明它是那种类型,即ok是一个bool。检查了这个https://golang.org/ref/spec#Type_assertions – Snowman