fileBytes,err := ioutil.ReadFile("/absolute/path/to/file.txt"); S: l( Q9 _ g* X* {4 y s
这份工作很正常,但并不完全便携。就我而言,我想打开的文件在我的 GOPATH例如: & \3 S. A. |3 a1 P" |
/Users/matt/Dev/go/src/github.com/mholt/mypackage/data/file.txt) C# Y0 r+ X8 m1 {1 Z
由于data文件夹位于源代码旁边,所以我只想指定相对路径:! x2 z( U/ d4 t7 n6 x; O$ N
data/file.txt ! U4 [1 {3 J( Q% `# ^5 c
但后来我收到了这个错误: 7 M, D' D. ?& k) h' ?7 `! C恐慌:打开数据/文件.txt:没有这样的文件或目录 # \* S3 R B. W$ c如何使用它们的相对路径打开文件,特别是当它们与我的 Go 代码并存时?# T. {& {! r# j6 k
(请注意,我的问题,尤其是相对于 的开放GOPATH 的文件。在 Go 使用任何相对路径打开文件都像提供相对路径而不是绝对路径一样简单;文件是相对于编译后的二进制文件的工作目录打开的。在这种情况下,我想打开与二进制文件编译位置相关的文件。后来,这似乎是一个糟糕的设计决定。; }" g" a1 p G& r/ j
# l9 @: }8 p) A2 a: j4 _, k 解决方案: ! Q7 `+ ]4 P: k& @& F
嗯......这个path/filepath包有Abs()我需要的东西(到目前为止),虽然有点不方便: 4 w1 m: B2 W; t
absPath,_ := filepath.Abs("../mypackage/data/file.txt") 6 U5 k' V3 ]6 e! E
然后我absPath用于加载工作正常的文件。 # x& m8 o' o2 s请注意,就我而言,数据文件位于和main我操作程序的不同包。如果都在同一个包里,我会删除前导../mypackage/. 由于路径明显相对,不同的程序会有不同的结构,需要相应的调整。 ( ^& c2 `$ D& C ^. v+ }如果有更好的方法在 Go 请随时提供另一个答案,使用外部资源并保持其可移植性。