Mongodb 应该如何声明Go上下文?

Mongodb 应该如何声明Go上下文?,mongodb,go,Mongodb,Go,假设我有一个修改数据库的文件,函数应该共享一个上下文,还是每个函数都有自己的上下文 共享上下文 var ( ctx = context.Background() ) func test1() { res, err := Collection.InsertOne(ctx, data) } func test2() { res, err := Collection.InsertOne(ctx, data) } 还是应该是这样 func test1() {

假设我有一个修改数据库的文件,函数应该共享一个上下文,还是每个函数都有自己的上下文

共享上下文

var (
    ctx = context.Background()
)

func test1() {
    res, err := Collection.InsertOne(ctx, data)
}

func test2() {
    res, err := Collection.InsertOne(ctx, data)
}
还是应该是这样

   func test1() {
        res, err := Collection.InsertOne(context.Background(), data)
    }
    
    func test2() {
        res, err := Collection.InsertOne(context.Background(), data)
    }

都不是。您的上下文应该是请求范围的(对于应用程序中的“请求”意味着什么),并通过调用链传递给每个函数

func test1(ctx context.context){
res,err:=Collection.InsertOne(ctx,数据)
}
func test2(ctx context.context){
res,err:=Collection.InsertOne(ctx,数据)
}
如果您正在构建web服务器,如注释所示,您通常会从处理程序中的HTTP请求获取上下文:

func myHandler(w http.ResponseWriter,r*http.Request){
ctx:=r.Context()
//现在将ctx传递给任何需要它的函数
//客户端/浏览器取消请求,您的下游功能将
//能够立即中止,而不会浪费时间完成任务
//工作。
}

您不应该使用第一种方法。上下文是要传递给函数的内容,不应将其声明为全局变量


有时可以使用第二种方法,特别是在没有请求上下文的情况下。但是,如果在一个服务器上下文中处理多个调用,则应将该调用的上下文传递给所有获得上下文的其他调用,因此当上下文被取消或过期时,所有调用都将失败。

使用您的方法,my ctx将在main.go的main函数中初始化一次。你是说我所有的数据库修改函数都应该使用与main中声明的相同的ctx?我不知道。这取决于你的应用程序在做什么。如果您的程序启动,执行一些查询,然后退出,那么是的,main中的单个
ctx
是有意义的。例如,如果它是一个web服务器,那么每个HTTP请求都应该使用一个
ctx
。这就澄清了这一点,谢谢“它不应该被声明为共享变量”->你的确切意思是什么?此外,传递上下文也很好——您可以将其传递给多个函数和多个goroutine,这没什么错。将其更改为“.global variable”,而不是共享变量。