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

Bla*_*man -2 go

有人可以解释以下语法在 Go 中的含义,特别是:

x.([]byte)
Run Code Online (Sandbox Code Playgroud)

我不确定这是什么意思,这是演员表吗?但是对于什么方法,因为它就在一个点之后?

func of(x interface{}) ByteView {
    if bytes, ok := x.([]byte); ok {
        return ByteView{b: bytes}
    }
    return ByteView{s: x.(string)}
}
Run Code Online (Sandbox Code Playgroud)

参考:https : //github.com/golang/groupcache/blob/master/byteview_test.go#L55

Sno*_*man 5

我们将其称为“类型断言”。

这在Language Spec 中得到了完美的记录。为了在 SO 上获得完整的答案(因为它是完整的答案)而不是仅提供链接的答案,我会将其包含在规范中最相关的信息中。这是文档,不是我的答案...

对于接口类型的表达式 x 和类型 T,主要表达式

x.(T)
Run Code Online (Sandbox Code Playgroud)

断言 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 
Run Code Online (Sandbox Code Playgroud)

在特殊形式的赋值或初始化中使用的类型断言

v, ok = x.(T) 
v, ok := x.(T)
var v, ok = x.(T) 
Run Code Online (Sandbox Code Playgroud)

产生一个额外的无类型布尔值。如果断言成立,则 ok 的值为真。否则它是假的并且 v 的值是类型 T 的零值。在这种情况下不会发生运行时恐慌。

Effective Go 是另一个很棒的资源,其中还包括有关接口转换和类型断言的部分:https : //golang.org/doc/effective_go.html#interface_conversions