下面来自MongoDB's Go quickstart blog post的代码片段在连接到数据库时创建context.WithTimeout
,并将其重用于延迟的Disconnect
函数,我认为这是错误的.
func main() {
client, err := mongo.NewClient(options.Client().ApplyURI("<ATLAS_URI_HERE>"))
if err != nil {
log.Fatal(err)
}
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
err = client.Connect(ctx)
if err != nil {
log.Fatal(err)
}
defer client.Disconnect(ctx)
}
我的 idea 是-
context.WithTimeout
设置创建时的最后期限(以Unix时间表示).
因此,将其传递给Connect
是有意义的,因为如果它超过了时间限制(即,派生的UNIX时间),我们希望取消建立连接的过程.
现在,将同样的ctx
传递给延迟的Disconnect
,这很可能在future 晚些时候被称为ctx
,这将导致ctx
的时间成为过go .这意味着,当函数开始执行时,它已经过期.这不是预期的,打破了逻辑-引用Disconnect
的文件-
如果上下文通过取消而期满, 截止时间或在正在使用的连接返回之前的超时,即正在使用的 连接将被关闭,从而导致任何动态读取失败 或写入操作.
请告诉我我是否错了和/或遗漏了什么,以及我是如何错的.