Go全局变量和短变量定义

Go global variable and short variable definition

在以下代码段中

package ...

var Conn *sql.DB // outer Conn

func Init(user, pwd, dbname string, port int) {
    Conn, err := sql.Open("postgres", "... args") // inner Conn
    // ..
}

内部Conn是一个新变量,外部Conn将保持为空。

通过显式定义 err 并用赋值替换短变量定义,它似乎正确地初始化了外部 Conn 变量

    var err error
    Conn, err = sql.Open("postgres", "... args") // inner Conn

是否有更简单的方法来指定内部 Conn 不应该真正是作用域变量,而是全局 Conn 变量?我在想类似 package.Conn 的东西,但它在包本身内部是无效的。

不,就是这样。 := 只是 New() (https://golang.org/doc/effective_go.html#allocation_new) 变量声明 (var foo int) 的快捷方式。一种更惯用的方法(通常也是更好的设计)是 return 连接而不是使用全局变量。

func Init(user string, pwd string, dbname string, port int) (*sql.DB, error) {
    // ...
}

依赖注入是你的朋友,尽量不要破坏作用域。

不,没有 shorthand 这个。 := 始终分配给当前(最内层)范围内的变量,必要时创建新变量。要分配给当前范围外的任何变量,您必须使用 = 而不是 :=,并且在多重分配的情况下,这意味着必须预先声明所有变量。