如何在包内调用未导出的函数?

How to call unexported function within package?

我正在尝试编写一个包来使用。这是示例代码:

package redis

import (
    "fmt"
    "github.com/gomodule/redigo/redis"
    "log"
    "os"
)

var conn redis.Conn

func init() {
    // code to set conn variable
}

func do(command string, args ...interface{}) (interface{}, error) {
    init()
    return conn.Do(command, args)
}

此代码无法编译,编译器提示 undefined: init。当我将 init() 更改为 Init() 时它可以工作,但我不希望它在包外可用。 无论我在哪里读到这个问题,它都说从 另一个 包调用未导出的函数,但在这里我从同一个包调用它。

此外,Goland IDE 将函数调用标记为 unresolved reference 并建议创建它。但是当我这样做时(通过 IDE 本身),它仍然看不到它。

在 Go 中,init 保留用于需要在包中完成的初始化工作,例如。向某些注册表添加一些实现。

要解决此问题,您需要使用其他名称。

如果您有兴趣,请查看 this question 以了解有关 init 的更多信息。

init() 是一个特殊函数。来自语言规范:

func init() { … }

Multiple such functions may be defined per package, even within a single source file. In the package block, the init identifier can be used only to declare init functions, yet the identifier itself is not declared. Thus init functions cannot be referred to from anywhere in a program.

使用 init() 进行包级初始化。