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 这个。 :=
始终分配给当前(最内层)范围内的变量,必要时创建新变量。要分配给当前范围外的任何变量,您必须使用 =
而不是 :=
,并且在多重分配的情况下,这意味着必须预先声明所有变量。
在以下代码段中
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 这个。 :=
始终分配给当前(最内层)范围内的变量,必要时创建新变量。要分配给当前范围外的任何变量,您必须使用 =
而不是 :=
,并且在多重分配的情况下,这意味着必须预先声明所有变量。