我不明白这种语法

ako*_*nsu 32 syntax go language-concepts type-assertion

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

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

有人请告诉我这里的语法吗?我理解sess.Values["user"]从会话中获取一个值,但接下来的部分是什么?为什么点后的表达式在括号中?这是函数调用吗?谢谢!

jul*_*enc 59

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

  • @akonsu,值得一提的是,用于类型断言的习语被称为"逗号ok"(`if value,ok:= try_to_obtain_value(); ok {...`),并在例如[ Effective Go"](http://golang.org/doc/effective_go.html) - 请参阅"地图"一节.我应该补充一点,这整个文件对于任何想成对的地鼠来说都是必读的. (5认同)
  • 还值得一提的是,虽然`b,ok:= i。(string)`就像_TryAssert_一样工作,但是如果断言无效,``b:= i。(string)`立即会惊慌。 (4认同)