【问题标题】: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"] 从会话中获取一个值,但是接下来的部分是什么?为什么括号中的点后面的表达式?这是函数调用吗?

【问题讨论】:

    标签: go syntax type-assertion language-concepts


    【解决方案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 的评论很有帮助。但它并没有像用户示例那样充分开发界面方面。我很快就有能力自己做到这一点,但由于这个问题已经结束,我会把它留在那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2017-08-24
    • 2012-03-01
    • 2017-10-01
    • 2012-10-15
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多