亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號