gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:16:40 27 4
gpt4 key购买 nike

我正在尝试从Firestore数据库中获取所有文档,并且一切正常。
但是后来我决定使上下文和客户端变量成为全局变量,这样就不必每次都将它们作为参数传递了。
此后事情破裂了。
我得到的错误是:panic: runtime error: invalid memory address or nil pointer dereference根据堆栈跟踪,它在我尝试执行以下操作时发生:client.Collection("dummy").Documents(ctx)我该怎么解决?
在我的情况下,如何有效地使用全局变量?
我的代码供引用:

package main

import (
"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()
}

最佳答案

之所以会出现该错误,是因为您从未将任何东西分配给包级别的ctx变量,因此它仍然是nil
init()内部,您使用short variable declaration创建一个局部变量:

ctx := context.Background()
如果更改为simple assignment,它将为现有的程序包级别 ctx变量分配一个值:
ctx = context.Background()
尽管使用“全局”变量存储非全局变量是一种不好的做法。您应该只在需要的地方传递 ctx

关于go - 如何在Golang中使用上下文全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63116382/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com