去全局变量和短变量定义

Mik*_*ite 2 go

在以下代码段中

package ...

var Conn *sql.DB // outer Conn

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

inner Conn是一个新变量,outer Conn将保持为null.

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

    var err error
    Conn, err = sql.Open("postgres", "... args") // inner Conn
Run Code Online (Sandbox Code Playgroud)

是否有更简单的方法来指定内部Conn不应该是一个范围变量而是全局Conn变量?我在想类似的东西package.Conn,但这在包装本身内是无效的.

kwo*_*lfe 6

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

func Init(user string, pwd string, dbname string, port int) (*sql.DB, error) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

依赖注入是你的朋友,尽量不要打破范围.


Ben*_*ell 5

不,这没有简写。:=始终分配给当前(最内层)作用域中的变量,并在必要时创建新变量。要分配给当前范围之外的任何变量,必须使用=代替:=,并且在多重分配的情况下,这意味着所有变量都必须预先声明。