为啥在init函数中使用的变量在main函数中没法得到的是nil?

package main

import (
    "database/sql"
    _ "-/github.com/go-sql-driver/mysql"
    "log"
    "fmt"
)

var Db *sql.DB

func init()  {
    Db , err := sql.Open("mysql","root:root@tcp(localhost:3306)/sql")
    if err != nil {
        log.Fatal(err)
    }
    Db.Ping()
    fmt.Println(Db)
}

func main()  {
    fmt.Print(Db)
}

打印数据

&{0x6edcd8 root:root@tcp(localhost:3306)/sql 0 {0 0} [0xc0420c2000] map[] 0 1 0xc042040120 false map[0xc0420c2000:map[0xc0420c2000:true]] map[] 0 0 0 <nil>}
<nil>
阅读 4.6k
2 个回答

你现在init 中的Db是一个局部变量,并不是你var声明的Db

package main

import (
    "database/sql"
    _ "-/github.com/go-sql-driver/mysql"
    "log"
    "fmt"
)

var Db *sql.DB

func init()  {
    var err error  // 首先声明出来err
    Db , err = sql.Open("mysql","root:root@tcp(localhost:3306)/sql")
    if err != nil {
        log.Fatal(err)
    }
    Db.Ping()
    fmt.Println(Db)
}

func main()  {
    fmt.Print(Db)
}

这样就可以了

这段代码,可以体现go 的:= 块级作用域特性

代码:

func main() {
    for i := 0; i < 3; i++ {
        for i := 0; i < 3; i++ {
            fmt.Println(i)
        }
    }
}

输出:

0
1
2
0
1
2
0
1
2
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题