我正在尝试从 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
它需要的地方。
- 1 回答
- 0 关注
- 145 浏览
添加回答
举报
0/150
提交
取消