在以下代码段
中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
这样的东西,但在包装本身里面无效。
答案 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)
不,没有这方面的简写。 :=
总是分配当前(最里面)范围内的变量,必要时创建新变量。要分配给当前范围之外的任何变量,必须使用=
而不是:=
,并且在多次赋值的情况下,这意味着必须预先声明所有变量。