78

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

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

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

4

1 回答 1

106

sess.Values["user"]是一个interface{},括号之间的内容称为类型断言。它检查 的值sess.Values["user"]是否属于 类型bson.ObjectId。如果是,那么ok将是true。否则,它将是false

例如:

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
于 2014-06-30T14:55:18.737 回答