“点括号”语法的含义是啥? [复制]

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 的评论很有帮助。但它并没有像用户示例那样充分开发界面方面。我很快就有能力自己做到这一点,但由于这个问题已经结束,我会把它留在那里。

以上是关于“点括号”语法的含义是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

*[ ... ] 语法是啥意思? [复制]

sql中count是啥含义

JavaScript 中的 ?: 语法是啥? [复制]

Python中的这个属性语法是啥? [复制]

Python 中的“变量 //= 值”语法是啥意思? [复制]

javascript 中的 obj?.prop 语法是啥? [复制]