在Go中做什么,看起来像演员

时间:2016-04-22 22:44:39

标签: go

有人可以解释以下语法在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

1 个答案:

答案 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