作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从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/
我是一名优秀的程序员,十分优秀!