php中文网

为什么在 Golang 中,导入包时使用 := 赋值给导出变量会导致无法访问?

php中文网

golang 无法访问导入包中的导出变量

在 golang 中,导入包时需要避免在 init 函数中给导出变量使用 := 赋值。这是因为使用 := 赋值时,变量只在局部作用域内存在,无法覆盖全局导出变量。

来看一个示例:

utils.go:

立即学习“go语言免费学习笔记(深入)”;

package utils

import (
    "log"

    "github.com/elastic/go-elasticsearch/v6"
)

// 导出变量
var esclient *elasticsearch.client

func init() {
    // ... 初始化 esclient,类似上面给出的代码 ...

    fmt.println(esclient) // 输出 esclient 的地址,非 nil
}

main.go:

package main

import "data_push/utils"

func main() {
    fmt.println(utils.esclient) // 输出 nil
}

在 utils.go 的 init 函数中,给 esclient 变量使用了 := 赋值,导致 esclient 成了局部变量,仅在本函数内有效。因此,在 main.go 中,输出的 esclient 为 nil。

正确的做法是:

func init() {
    // ... 初始化 EsClient,类似上面给出的代码 ...

    EsClient = client // 覆盖全局导出变量
}

这样,init 函数将全局导出变量 esclient 的值替换为新值,在 main.go 中就可以正确的访问到这个变量。

以上就是为什么在 Golang 中,导入包时使用 := 赋值给导出变量会导致无法访问?的详细内容,更多请关注php中文网其它相关文章!