“点括号”语法的含义是啥? [复制]
Posted
技术标签:
【中文标题】“点括号”语法的含义是啥? [复制]【英文标题】:What is the meaning of "dot parenthesis" syntax? [duplicate]“点括号”语法的含义是什么? [复制] 【发布时间】:2014-08-20 23:40:35 【问题描述】:我正在研究一个在 mongodb 中存储数据的示例 Go 应用程序。这一行的代码 (https://github.com/zeebo/gostbook/blob/master/context.go#L36) 似乎访问了存储在 gorilla 会话中的用户 ID:
if uid, ok := sess.Values["user"].(bson.ObjectId); ok
...
有人可以向我解释一下这里的语法吗?我知道sess.Values["user"]
从会话中获取一个值,但是接下来的部分是什么?为什么括号中的点后面的表达式?这是函数调用吗?
【问题讨论】:
【参考方案1】:sess.Values["user"]
是 interface
,括号之间的内容称为 type assertion。它检查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
【讨论】:
@akonsu,值得一提的是,用于类型断言的惯用语被称为“comma ok”(if value, ok := try_to_obtain_value(); ok ...
),例如,在"Effective Go" 中进行了解释——参见章节称为“地图”。我应该补充一点,整篇文档对于任何想成为地鼠的人来说都是必读的。
还值得一提的是,虽然b, ok := i.(string)
的工作方式类似于 TryAssert,但如果断言无效,b := i.(string)
会立即发生恐慌。
谢谢,这个sess.Values["user"].(type)
返回类型怎么样,对吧?
老实说,这是一个有点有用的答案,@kostix 关于comma ok
的评论很有帮助。但它并没有像用户示例那样充分开发界面方面。我很快就有能力自己做到这一点,但由于这个问题已经结束,我会把它留在那里。以上是关于“点括号”语法的含义是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章