为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Golang 中使用上下文全局变量?

如何在 Golang 中使用上下文全局变量?

Go
慕田峪9158850 2022-06-21 10:19:46
我正在尝试从 Firestore 数据库中获取所有文档,并且一切正常。但后来我决定将上下文和客户端变量设为全局变量,这样我就不必每次都将它们作为参数传递。之后事情就破裂了。我得到的错误是: panic: runtime error: invalid memory address or nil pointer dereference根据堆栈跟踪,当我尝试: client.Collection("dummy").Documents(ctx)我能做些什么来解决这个问题?在我的情况下,如何有效地使用全局变量?我的参考代码:package mainimport (    "context"    "fmt"    "log"    "cloud.google.com/go/firestore"    firebase "firebase.google.com/go"    "google.golang.org/api/iterator"    "google.golang.org/api/option")var (    ctx    context.Context    client *firestore.Client)func init() {    ctx := context.Background()    keyFile := option.WithCredentialsFile("serviceAccountKey.json")    app, err := firebase.NewApp(ctx, nil, keyFile)    if err != nil {        log.Fatalln(err)    }    client, err = app.Firestore(ctx)    if err != nil {        log.Fatalln(err)    }    fmt.Println("Connection to Firebase Established!")}func getDocuments(collectionName string) {    iter := client.Collection("dummy").Documents(ctx)    for {        doc, err := iter.Next()        if err == iterator.Done {            break        }        if err != nil {            log.Fatalf("Failed to iterate: %v", err)        }        fmt.Println(doc.Data()["question"])    }}func main() {    getDocuments("dummy")    defer client.Close()}
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

您收到该错误是因为您从未将任何内容分配给包级别ctx变量,因此它仍然是nil.

在内部init()使用创建局部变量的短变量声明:

ctx := context.Background()

如果您更改为 simple assignment,它将为现有的包级ctx变量分配一个值:

ctx = context.Background()

尽管使用“全局”变量来存储非全局变量是不好的做法。你应该只是通过ctx它需要的地方。


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信