我正在研究一个在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"]会从会话中获得一个值,但是接下来的部分是什么呢?为什么表达式在圆括号中的圆点后面?这是函数调用吗?

推荐答案

sess.Values["user"]interface{},括号之间的叫做100.它判断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

Go相关问答推荐

在连接表中以添加字段作为主要关键字的多对多

如何使用我的 struct 化日志(log)记录格式使人panic ?

如何将GoFr筛选器用于查询参数?

我找不到pcap.Openlive的设备名称

从 wincrypt API 到 Go 的 RC2 解密

在 Go 中将元数据从一个 JPEG 复制到另一个

使用 Go 根据 /etc/shadow 文件中的散列密码验证密码

golang:解组动态 YAML 注释

加密/椭圆:try 在无效点上进行操作

Go:如何在将 float64 转换为 float32 时判断精度损失

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

为超时的单元测试创​​建 deadlineExceededError:true

Protobuf.Any - 从 json.RawMessage 解组

来自洪流公告的奇怪同行字段

为什么在单独的 go routine 中需要 wg.Wait() 和 close() ?

Go 使用 struct 作为接口而不实现所有方法

不理解切片和指针

防止在 Go 公用文件夹中列出目录

如何使用通用字段初始化匿名struct数组

关于GO的几个问题