我正在使用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 程序中使用外部资源并保持其可移植性,请随时提供另一个答案。