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

时间:2019-12-13 03:08:35

标签: go goland

我正在尝试编写一个可以使用的软件包。这是示例代码:

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本身)时,仍然看不到它。

2 个答案:

答案 0 :(得分:4)

init()是一个特殊功能。根据语言规范:

  

func init(){…}

     

即使每个包中都可以定义多个此类功能    单个源文件。在package块中,init标识符可以    仅用于声明init函数,而标识符本身    未声明。因此,init函数不能从    程序中的任何地方。

使用init()进行程序包级别的初始化。

答案 1 :(得分:2)

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

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

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