传递上下文的最佳方式

huangapple go评论82阅读模式
英文:

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
}

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

英文:

I've done a lot of research regarding context, but I can't seem to find a generally accepted answer, plus I'm new to Go.

In my current code I've var ctx = context.Background(),which is used in various places.

My concern is, aren't all my code modifying the same context since it's a global variable? .

Yes, I know context is request scoped.

This is part of my code for context.

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
}

Please try not to use overly complicated words to describe a term.

答案1

得分: 4

go中,将上下文从一个函数传递到另一个函数是一种被接受的做法。通常,每个函数的第一个参数是context类型。我注意到,每当一个上下文被传递并在方法范围内有一些用例时,都会从父上下文创建一个新的上下文。

英文:

Its an accepted practice in go to pass context from function to function. Normally, the first parameter of every function if context type. I have seen that whenever a context is passed down and has some use-case with in the method scope, a new context is created from parent context.

答案2

得分: 1

最佳实践是在函数内部创建上下文,并根据需要在函数之间传递上下文,而不是在整个包中共享一个上下文。对于像HTTP服务器这样的情况,通常会为每个传入的API调用创建一个唯一的上下文。

英文:

It is best practice to create a context inside of a function and pass it between functions as needed, rather than having the one context shared across the package. For something like a HTTP server, you will typically see a unique context for each incoming API call.

huangapple
  • 本文由 发表于 2022年4月26日 09:37:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/72007434.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定