首页 > 解决方案 > 如何在包中调用未导出的函数?

问题描述

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

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

标签: gogoland

解决方案


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

func init() { … }

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

用于init()包级初始化。


推荐阅读