我正在io/ioutil读取一个小的文本文件:
io/ioutil
fileBytes, err := ioutil.ReadFile("/absolute/path/to/file.txt")
效果很好,但这不是完全可移植的。就我而言,我要打开的文件位于我的GOPATH中,例如:
/Users/matt/Dev/go/src/github.com/mholt/mypackage/data/file.txt
由于该data文件夹位于源代码的旁边,因此我只想指定相对路径:
data
data/file.txt
但是然后我得到这个错误:
恐慌:打开数据/文件。txt:没有此类文件或目录
如何使用文件的相对路径打开文件,尤其是当文件与我的Go代码一起存在时?
( 请注意,我的问题特别是关于打开相对于GOPATH的 文件 。 在Go中使用任何相对路径打开文件就像给出相对路径而不是绝对路径一样容易;文件是相对于已编译二进制文件的工作目录打开的。在这种情况下,我想打开相对于二进制文件编译位置的文件。事后看来,这是一个错误的设计决定。)
嗯。。。虽然有点不方便,但是path/filepath包装有满足Abs()我需要的东西(到目前为止):
path/filepath
Abs()
absPath, _ := filepath.Abs("../mypackage/data/file.txt")
然后,我使用它absPath来加载文件,并且工作正常。
absPath
请注意,就我而言,数据文件位于与main我正在运行程序的程序包不同的程序包中。如果所有包装都在同一包装中,我将删除前导../mypackage/。由于该路径显然是相对的,因此不同的程序将具有不同的结构,并且需要对此进行相应的调整。
main
../mypackage/
如果有更好的方法可以将外部资源与Go程序一起使用并保持可移植性,请随时提出其他答案。