为什么我的 tiedot DB 指针是 nil?

huangapple go评论88阅读模式
英文:

Why is my tiedot DB pointer nil?

问题

var myDB *db.DB

func init() {
myDB, err := db.OpenDB("db")
if err := myDB.Create("Feeds"); err != nil {}
if err := myDB.Create("Votes"); err != nil {}
}

func idb() {
for _, name := range myDB.AllCols() {
fmt.Printf("我有一个叫做%s的集合\n", name)
}
}

func main() {
idb()
}

我得到了以下错误:

运行时错误:无效的内存地址或空指针解引用

这可能是因为myDBnil,但是为什么以及如何修复它,以便我可以在init中设置myDB?

请注意,如果我只是在main中放弃使用全局变量,它是可以工作的。

英文:
var myDB *db.DB

func init() {
	myDB, err := db.OpenDB("db")
	if err := myDB.Create("Feeds"); err != nil {}
	if err := myDB.Create("Votes"); err != nil {}
}

func idb() {
    for _, name := range myDB.AllCols() {
	    fmt.Printf("I have a collection called %s\n", name)
    }    
}

func main() {
    idb()
}

I get the following error:

>runtime error: invalid memory address or nil pointer dereference

It is probably because myDB is nil, but why and how can I fix it so I can setup myDB in init?

Note that if I just drop everything in main without using a global variable, it works.

答案1

得分: 3

> 短变量声明
>
> 短变量声明使用以下语法:
>
> 短变量声明 = 标识符列表 ":=" 表达式列表。
>
> 它是一个带有初始化表达式但没有类型的常规变量声明的简写形式:
>
> "var" 标识符列表 = 表达式列表。

myDB 是一个局部的 init 函数变量。:= 是一个短变量声明。

myDB, err := db.OpenDB("db")

要更新包 myDB 变量,可以写成:

var err error
myDB, err = db.OpenDB("db")
英文:

> Short variable declarations
>
> A short variable declaration uses the syntax:
>
> ShortVarDecl = IdentifierList ":=" ExpressionList .
>
> It is shorthand for a regular variable declaration with initializer
> expressions but no types:
>
> "var" IdentifierList = ExpressionList .

myDB is a local init function variable. := is a short variable declaration.

myDB, err := db.OpenDB("db")

To update package myDB variable, write,

var err error
myDB, err = db.OpenDB("db")

huangapple
  • 本文由 发表于 2014年10月31日 05:04:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/26663260.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定