如何在 Golang Google Datastore 包中正确使用上下文?
How to use the context properly in Golang Google Datastore package?
我已经开始在我目前工作的公司的一个项目中使用 Google Cloud Datastore。
https://godoc.org/cloud.google.com/go/datastore
在提供的示例中,他们使用上下文并将其传递给连接实例
ctx := context.Background()
dsClient, err := datastore.NewClient(ctx, "my-project")
通过文档您将看到它们将上下文传递给对数据库进行操作的所有函数,我不确定它们是传递相同的指针还是为每个操作创建一个新指针。
我的当前设置是一个名为 "store" 的包中上下文的全局变量,我保留了与数据库通信的所有结构函数,并且我每次都使用该全局变量。我不知道那有什么影响,我不确定为什么要使用上下文,我每次对数据库进行操作时都应该得到 context.Background()
的引用吗?
context.Background 是全局上下文——所以不需要全局变量。大多数情况下,您会希望使用该上下文的子项,取消或超时。
ctx, cancel := context.WithCancel(context.Background)
//or
ctx, cancel := context.WithTimeout(context.Background, time.Second * 30)
然后您可以使用取消功能很好地关闭您的应用程序,或者如果请求挂起则取消并重试。如果您从不打算取消或超时操作,那么使用 context.Background 就可以了。
此外,context.Context 是一个接口,因此它总是通过引用传递,因此对某个实例的所有使用都指向相同的上下文。
我已经开始在我目前工作的公司的一个项目中使用 Google Cloud Datastore。
https://godoc.org/cloud.google.com/go/datastore
在提供的示例中,他们使用上下文并将其传递给连接实例
ctx := context.Background()
dsClient, err := datastore.NewClient(ctx, "my-project")
通过文档您将看到它们将上下文传递给对数据库进行操作的所有函数,我不确定它们是传递相同的指针还是为每个操作创建一个新指针。
我的当前设置是一个名为 "store" 的包中上下文的全局变量,我保留了与数据库通信的所有结构函数,并且我每次都使用该全局变量。我不知道那有什么影响,我不确定为什么要使用上下文,我每次对数据库进行操作时都应该得到 context.Background()
的引用吗?
context.Background 是全局上下文——所以不需要全局变量。大多数情况下,您会希望使用该上下文的子项,取消或超时。
ctx, cancel := context.WithCancel(context.Background)
//or
ctx, cancel := context.WithTimeout(context.Background, time.Second * 30)
然后您可以使用取消功能很好地关闭您的应用程序,或者如果请求挂起则取消并重试。如果您从不打算取消或超时操作,那么使用 context.Background 就可以了。
此外,context.Context 是一个接口,因此它总是通过引用传递,因此对某个实例的所有使用都指向相同的上下文。