Go 导入包时,导出变量为何会是空值?
go 导入包时访问导出变量受限
在 go 中导入包时,能够访问包中导出的变量、类型和函数。但有时,导入的包中无法访问某些导出变量,出现 nil 值。
这个问题通常发生在包初始化函数(init)中给导出变量重新赋值。例如:
// utils.go package utils import ( "log" elastic "github.com/elastic/go-elasticsearch/v6" ) var esclient *elastic.client func init() { // 初始化并赋值 esclient cfg := elastic.config{ addresses: []string{""}, } esclient = nil // 这里覆盖了全局变量 esclient esclient, err := elastic.newclient(cfg) if err != nil { log.fatal(err) } }
在 init 函数中使用 esclient = nil 重新赋值后,覆盖了全局变量 esclient。因此,虽然在 init 函数中 esclient 已被正确初始化,但在其他地方访问时,它将保持 nil 值。
为了避免这种情况,建议使用下列做法:
func init() { cfg := elastic.Config{ Addresses: []string{""}, } if EsClient == nil { // 如果 EsClient 为 nil,则初始化 EsClient, err := elastic.NewClient(cfg) if err != nil { log.Fatal(err) } } }
这样一来,init 函数只会初始化当前尚未初始化的全局变量值,避免意外覆盖。
以上就是Go 导入包时,导出变量为何会是空值?的详细内容,更多请关注其它相关文章!