我正在尝试编写一个可以使用的软件包。这是示例代码:
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本身)时,仍然看不到它。
答案 0 :(得分:4)
init()是一个特殊功能。根据语言规范:
func init(){…}
即使每个包中都可以定义多个此类功能 单个源文件。在package块中,init标识符可以 仅用于声明init函数,而标识符本身 未声明。因此,init函数不能从 程序中的任何地方。
使用init()
进行程序包级别的初始化。
答案 1 :(得分:2)
在Go中,init
保留用于初始化需要在程序包中完成的工作,例如。在注册表中添加一些实现。
要解决此问题,您需要使用其他名称。
如果有兴趣,请看this question,以了解有关init
的更多信息。