这是什么做的围棋,看起来像一个铸造
问题描述:
有人能解释下面的语法是指围棋,specifially:这是什么做的围棋,看起来像一个铸造
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
答
我们将此称为 “式的断言。”
这完全记录在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