【问题标题】:Go global variable and short variable definitionGo 全局变量和短变量定义
【发布时间】:2018-05-29 19:05:58
【问题描述】:

在下面的sn-p中

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 之类的东西,但这在包本身内是无效的。

【问题讨论】:

  • 没有。但真的有那么长,你想缩短它吗?如果是,那么还要将err 变量设为全局...

标签: go


【解决方案1】:

不,就是这样。 := 只是 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) {
    // ...
}

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

【讨论】:

  • ":= 只是 New() 的快捷方式" 似乎不对:new() 返回一个指针,但 x := 1 没有创建指针。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多