Go 变量在函数中时变为零

Go 变量在函数中时变为零,go,Go,为什么getBooks函数中的db变量是nil package main import ( ... ) var db *sql.DB func init() { gotenv.Load() } func main() { db, err := sql.Open("postgres", os.Getenv("ELEPHANTSQL_URL")) err = db.Ping() fmt.Println(db, err) router :=

为什么
getBooks
函数中的
db
变量是
nil

package main

import (
    ...
)

var db *sql.DB

func init() {
    gotenv.Load()
}

func main() {

    db, err := sql.Open("postgres", os.Getenv("ELEPHANTSQL_URL"))
    err = db.Ping()
    fmt.Println(db, err)

    router := mux.NewRouter()
    router.HandleFunc("/books", getBooks).Methods("GET")
    log.Fatal(http.ListenAndServe("localhost:8000", router))
}

func getBooks(w http.ResponseWriter, r *http.Request) {
    if db == nil {
        log.Print("!!!!!!!!!!")
        os.Exit(2)
    }
}

使用
:=
可以在
main()
范围内声明一个新的
db
变量,而不是在包范围内分配给
db
变量

您必须仅使用
=
或使用
db
以外的其他名称

试试这个:

var错误
db,err=sql.Open(“postgres”,os.Getenv(“ELEPHANTSQL_URL”))