传递上下文的最佳方式
Best way to pass 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
}
请尽量不要使用过于复杂的词语来描述术语。
在 go
中,将上下文从一个函数传递到另一个函数是一种公认的做法。通常,每个函数的第一个参数都是 if context
类型。我已经看到,每当一个上下文被传递下来并且在方法范围内有一些 use-case with 时,就会从父上下文创建一个新的上下文。
最佳做法是在函数内部创建一个上下文并根据需要在函数之间传递它,而不是让一个上下文在整个包中共享。对于 HTTP 服务器之类的东西,您通常会看到每个传入 API 调用的唯一上下文。
我对上下文做了很多研究,但我似乎找不到一个普遍接受的答案,而且我是 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
}
请尽量不要使用过于复杂的词语来描述术语。
在 go
中,将上下文从一个函数传递到另一个函数是一种公认的做法。通常,每个函数的第一个参数都是 if context
类型。我已经看到,每当一个上下文被传递下来并且在方法范围内有一些 use-case with 时,就会从父上下文创建一个新的上下文。
最佳做法是在函数内部创建一个上下文并根据需要在函数之间传递它,而不是让一个上下文在整个包中共享。对于 HTTP 服务器之类的东西,您通常会看到每个传入 API 调用的唯一上下文。