go - 如何在包中调用未导出的函数?
问题描述
我正在尝试编写一个可以使用的包。这是示例代码:
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 本身),它仍然看不到它。
解决方案
init() 是一个特殊的函数。从语言规范:
func init() { … }
每个包都可以定义多个这样的函数,即使在单个源文件中也是如此。在 package 块中,init 标识符只能用于声明 init 函数,而标识符本身并未声明。因此,不能从程序中的任何地方引用 init 函数。
用于init()
包级初始化。
推荐阅读
- express - 节点请求在控制台日志中显示 jwt 令牌,但无法在 cookie 中设置
- pointers - 在 Delphi 的泛型函数中分配对象的指针函数属性 - 为什么这段代码有效?
- php - 检查当前日期是否是 CET 和 CEST 之间的变化日
- ios - 当应用程序在苹果商店或 testFlight 上发布时,plist 中的框架版本号由 XCode 13 更改
- c++ - struct Snake { int x, y; 是什么意思?} 蛇[225]; 意思是?
- amazon-web-services - AWS - CloudFormation - 使用 CodestarSource 连接的 GitHub 完整克隆
- azure - Microsoft Graph API 在授予权限时出现未经授权的错误
- installation - SLES 10 SP4 iso 下载或我可以从哪里得到它?
- php - 在我的 laravel 项目中出现 yahoo 错误
- docker - 在 docker 容器中运行我的 selenium 客户端代码时出现“PKIX 路径构建失败”错误