Golang Go语言中包的 init 函数问题
今天在写代码的时候,发现一个有点违反直觉的地方,如下的文件夹结构:
├── XXX
│ ├── xxx.go
│ └── 123.txt
│
└── main.go
XXX 包的 xxx.go 中 init 函数会去打开 123.txt:
os.Open("123.txt") //这个会失败
os.Open("XXX/123.txt") //这个才能成功打开文件
有谁知道为什么前一个打开会失败吗?
谢谢。
Golang Go语言中包的 init 函数问题
其实这不违反直觉啊。
因为编译好的文件和你的代码是两个不同的东西,源文件的相对位置和可执行文件的相对位置自然是不一样的。
,那 123.txt 只有 XXX 包会用,在 xxx.go 文件里面的应该怎么写路径?是不是我只能将 123.txt 的内容也编译进代码里面?
,理解了,谢谢。
看起来应该用 go-bindata
在Golang(Go语言)中,init
函数是一个非常特殊的函数,它具有以下几个关键特点:
-
自动调用:每个包可以包含一个或多个
init
函数。当程序开始执行并且包被导入时,这些init
函数会在main
函数之前自动被调用。这是初始化包级变量、执行设置操作等任务的理想时机。 -
无参数无返回值:
init
函数不接受任何参数,也不返回任何值。它们的签名固定为func init()
。 -
执行顺序:同一个包内的
init
函数按照它们在源代码中出现的顺序执行。如果包之间有依赖关系,Go语言的构建工具(如go build
)会确保按照依赖顺序执行init
函数。 -
仅执行一次:无论包被导入多少次,其
init
函数只会被执行一次。 -
不可显式调用:
init
函数不能在其他函数中显式调用。这是由Go语言的运行时环境自动管理的。 -
多文件支持:一个包可以分布在多个文件中,每个文件都可以有自己的
init
函数。所有这些init
函数都会按照上述规则被调用。
理解init
函数的这些特性对于编写健壮的Go程序至关重要,因为它们提供了在程序启动时进行必要设置和初始化的机制。正确地使用init
函数可以帮助确保程序的稳定性和正确性。