去全局变量和短变量定义

时间:2015-02-02 18:18:28

标签: go

在以下代码段

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这样的东西,但在包装本身里面无效。

2 个答案:

答案 0 :(得分: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) {
    // ...
}

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

答案 1 :(得分:4)

不,没有这方面的简写。 :=总是分配当前(最里面)范围内的变量,必要时创建新变量。要分配给当前范围之外的任何变量,必须使用=而不是:=,并且在多次赋值的情况下,这意味着必须预先声明所有变量。