有人可以解释以下语法在Go中的含义,特别是:
x.([]byte)
我不确定这意味着什么,这是演员吗?但对于什么方法,因为它只是在一个点之后?
func of(x interface{}) ByteView {
if bytes, ok := x.([]byte); ok {
return ByteView{b: bytes}
}
return ByteView{s: x.(string)}
}
参考:https://github.com/golang/groupcache/blob/master/byteview_test.go#L55
答案 0 :(得分:4)
我们称之为“类型断言。”
Language Spec中详细记录了这一点。为了在SO上有完整的答案(因为它是整个答案)而不是仅链接答案,我将从规范中包含它最相关的信息。这是文档,而不是我的答案......
对于接口类型的表达式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.如果类型断言为false,则a 发生运行时恐慌。换句话说,即使是动态类型 x仅在运行时已知,x。(T)的类型已知为a中的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的值为true。 否则为false,v的值为类型T的零值。 在这种情况下,不会发生运行时恐慌。
Effective Go是另一个很棒的资源,它还包括一个关于接口转换和类型断言的部分: https://golang.org/doc/effective_go.html#interface_conversions