传递上下文的最佳方式

Fra*_*ike 2 go go-context

我已经做了很多关于上下文的研究,但我似乎找不到普遍接受的答案,而且我是Go的新手。

在我当前的代码中,我var ctx = context.Background()已经在各个地方使用了它。

我担心的是,我的所有代码不是都修改相同的上下文吗,因为它是全局变量?。

是的,我知道上下文是请求范围的。

这是我的上下文代码的一部分。

var ctx = context.Background()

var db *firestore.Client

var auth *aut.Client

func init() {
    app, err := firebase.NewApp(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }
    db, err = app.Firestore(ctx)
    if err != nil {
        log.Fatal(err)
    }
    auth, err = app.Auth(ctx)
    if err != nil {
        log.Fatal(err)
    }
}

func SetRate(r int) (err error) {
    //TODO: create last updated field
    _, err = db.Collection("Rate").Doc("rate").Set(ctx, map[string]int{"USDT": r})
    if err != nil {
        log.Println(err)
        return err
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

请尽量不要使用过于复杂的词语来描述术语。

Em *_* Ae 5

go将上下文从一个函数传递到另一个函数是一种公认​​的做法。通常,每个函数的第一个参数都是 ifcontext类型。我已经看到,每当上下文被传递并且在方法范围内有一些用例时,就会从父上下文创建一个新上下文。

  • 是的。一般来说,主上下文是在系统入口处创建的。无论是休息 API 请求、命令行输入还是其他任何内容。然后将该上下文传递到系统中。可能存在需要新上下文的情况。在这种情况下,新的上下文是从*传递的*上下文创建的,即`childCtx := context.WithValue(ctx, "key", "value")`。现在,这个“childCtx”的范围从这个给定的函数开始,“ctx”是主要上下文。 (2认同)