go - 为什么在新计算机上访问 Firestore 时出现 ‘panic: runtime error: invalid memory address or nil pointer dereference’?

标签 go google-cloud-firestore go-testing

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.

2年前关闭。




Improve this question




如果我尝试运行测试或直接通过以下方式运行应用程序,我会感到 panic :go run main.go
该代码在我的旧 Macbook Pro 上运行良好。它在我的新 Macbook Pro 上出现 panic 。

我认为该错误与访问 Firestore 数据存储有关,但我不确定出了什么问题。

我正在运行相同的代码,因此数据存储区 key 和其他所有内容都应该相同。

这是 Github 仓库:
https://github.com/golangnewb/FirestoreTestHttp

工作电脑:
go 版本 go1.11.2 darwin/amd64

panic 计算机:
go 版本 go1.13.5 darwin/amd64

❯ go test
--- FAIL: TestCities (0.01s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x14d557a]

goroutine 6 [running]:
testing.tRunner.func1(0xc000312200)
    /usr/local/go/src/testing/testing.go:874 +0x3a3
panic(0x15ac100, 0x1b3e740)
    /usr/local/go/src/runtime/panic.go:679 +0x1b2
cloud.google.com/go/firestore.(*Client).path(...)
    /Users/XXX/go/src/cloud.google.com/go/firestore/client.go:107
cloud.google.com/go/firestore.(*Client).Collection(0x0, 0x1677ac0, 0x6, 0x14)
    /Users/XXX/go/src/cloud.google.com/go/firestore/client.go:122 +0x9a
_/Users/XXX/Dropbox/go/src/firestoreTestHttp.addCitiesFirestore(0x5e4c4feb, 0xc000064760)
    /Users/XXX/Dropbox/go/src/firestoreTestHttp/city_handlers_test.go:218 +0x13d
_/Users/XXX/Dropbox/go/src/firestoreTestHttp.TestCities(0xc000312200)
    /Users/XXX/Dropbox/go/src/firestoreTestHttp/city_handlers_test.go:19 +0x26
testing.tRunner(0xc000312200, 0x16a1c98)
    /usr/local/go/src/testing/testing.go:909 +0xc9
created by testing.(*T).Run
    /usr/local/go/src/testing/testing.go:960 +0x350
exit status 2
FAIL    _/Users/XXX/Dropbox/go/src/firestoreTestHttp    0.165s

如果我尝试通过以下方式运行,这是 panic :

❯去运行main.go

2020/02/18 17:19:39 http: panic serving [::1]:60479: runtime error: invalid memory address or nil pointer dereference
goroutine 9 [running]:
net/http.(*conn).serve.func1(0xc00027c6e0)
    /usr/local/go/src/net/http/server.go:1767 +0x139
panic(0x15a69c0, 0x1b39a50)
    /usr/local/go/src/runtime/panic.go:679 +0x1b2
cloud.google.com/go/firestore.(*Client).path(...)
    /Users/XXX/go/src/cloud.google.com/go/firestore/client.go:107
cloud.google.com/go/firestore.(*Client).Collection(0x0, 0x16728ba, 0x6, 0x14)
    /Users/XXX/go/src/cloud.google.com/go/firestore/client.go:122 +0x9a
main.indexHandler(0x1744360, 0xc000322000, 0xc0002c8200)
    /Users/XXX/Dropbox/go/src/firestoreTestHttp/main.go:50 +0xa2
net/http.HandlerFunc.ServeHTTP(0x169da80, 0x1744360, 0xc000322000, 0xc0002c8200)
    /usr/local/go/src/net/http/server.go:2007 +0x44
net/http.(*ServeMux).ServeHTTP(0xc0002ea100, 0x1744360, 0xc000322000, 0xc0002c8200)
    /usr/local/go/src/net/http/server.go:2387 +0x1bd
net/http.serverHandler.ServeHTTP(0xc000312000, 0x1744360, 0xc000322000, 0xc0002c8200)
    /usr/local/go/src/net/http/server.go:2802 +0xa4
net/http.(*conn).serve(0xc00027c6e0, 0x17457a0, 0xc00008cf80)
    /usr/local/go/src/net/http/server.go:1890 +0x875
created by net/http.(*Server).Serve
    /usr/local/go/src/net/http/server.go:2928 +0x384

最佳答案

虽然我在围棋中感觉不太好,但我会试一试。如果我错了,请告诉我。

从错误看来,客户端是零。在 main 中附加的 Git 存储库中,您正在记录它应该设置为环境变量 GCLOUD_PROJECT,但是我没有找到任何 so.Getenv获取此值的函数。也许这个值是错误的......?

所以我猜这个说法client, _ := firestore.NewClient(ctx, projectID)正在使用错误的 projectID 调用。在语句中省略了错误处理,因此我们不知道客户端是否已正确创建。如果它没有被创建,那我们应该得到这样的错误。

也许您应该添加错误处理,如 Go Firestore Reference 中的示例。 ,以确保在客户端创建过程中没有错误。

我希望这能帮到您!

关于go - 为什么在新计算机上访问 Firestore 时出现 ‘panic: runtime error: invalid memory address or nil pointer dereference’?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60290447/

相关文章:

google-app-engine - 您的应用程序不在 GOPATH 上 - 部署到 app Engine go1.12

go - 获取外部/父结构名称

android - 如何检查firestore中是否已存在某些数据

flutter - 如何在 Flutter 中将容器制作为单选按钮并确保它不会取消选择

go - 不应通过中间件HTTP测试

dictionary - 将映射值复制到指针的结构

go - 如何比较 Golang 中的结构数据和接口(interface)数据?

firebase - 如何将图像添加到 Firestore

unit-testing - 如何模拟Viper config getter

go - 如何模拟多个 url 以返回夹具内容?