我在用着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/file.txt
但后来我得到这个错误:
恐慌:打开 data/file.txt:没有这样的文件或目录
如何使用相对路径打开文件,尤其是当它们与我的 Go 代码一起存在时?
(请注意,我的问题具体是关于打开相对于 GOPATH 的文件。在 Go 中使用任何相对路径打开文件就像给出相对路径而不是绝对路径一样简单;文件是相对于编译的二进制文件的工作目录打开的。就我而言,我想打开与二进制文件编译位置相关的文件。事后看来,这是一个糟糕的设计决策。)
嗯……那个path/filepath
包有Abs() http://golang.org/pkg/path/filepath/#Abs虽然有点不方便,但它满足了我的需要(到目前为止):
absPath, _ := filepath.Abs("../mypackage/data/file.txt")
然后我用absPath
加载文件并且工作正常。
请注意,就我而言,数据文件位于与main
我从中运行程序的包。如果它们都在同一个包中,我会删除前导../mypackage/
。由于这条路径显然是相对的,不同的程序会有不同的结构,需要进行相应的调整。
如果有更好的方法在 Go 程序中使用外部资源并保持其可移植性,请随时贡献另一个答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)