“点括号”句法的含义是什么?

我正在研究一个示例 Go 应用程序,它将数据存储在 mongodb 中。这一行的代码(https://github.com/zeebo/gostbook/blob/master/context.go#L36)似乎可以访问存储在 gorilla 会话中的用户 ID:

if uid, ok := sess.Values["user"].(bson.ObjectId); ok {
...
}

有人能给我解释一下这里的语法吗?我知道 sess.Values["user"]从会话中获得一个值,但是接下来的部分是什么呢?为什么表达式在圆括号中的点后面?这是一个函数调用吗?

18127 次浏览

sess.Values["user"] is an interface{}, and what is between parenthesis is called a type assertion. It checks that the value of sess.Values["user"] is of type bson.ObjectId. If it is, then ok will be true. Otherwise, it will be false.

For instance:

var i interface{}
i = int(42)


a, ok := i.(int)
// a == 42 and ok == true


b, ok := i.(string)
// b == "" (default value) and ok == false