2016-04-22 104 views
-1

有人能解释下面的语法是指围棋,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

+0

检查了这一点https://golang.org/doc/effective_go.html#interface_conversions –

+0

它一种方便的方式来获得实现界面的具体类型。它是类型断言。 interface {}可以接受任何类型,在这种情况下,如果该类型是[] byte,那么它将被分配给'bytes','ok'将表明它是那种类型,即ok是一个bool。检查了这个https://golang.org/ref/spec#Type_assertions – Snowman

回答

4

我们将此称为 “式的断言。”

这完全记录在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

相关问题