Go 导入包时,导出变量为何会是空值?

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 导入包时,导出变量为何会是空值?的详细内容,更多请关注其它相关文章!