1. ホーム
  2. go

GOPATH に関係するファイルを開くにはどうしたらいいですか?

2023-08-31 22:44:21

質問

私は 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

しかし、このようなエラーが出てしまいます。

panic: open data/file.txt: そのようなファイルまたはディレクトリはありません。

相対パスを使ってファイルを開くにはどうしたらよいですか。特に、ファイルが Go コードと一緒に存在する場合は。

( 私の質問は、特にGOPATHに相対するファイルを開くことについてであることに注意してください。 Goで任意の相対パスを使用してファイルを開くことは、絶対パスの代わりに相対パスを与えるのと同じくらい簡単です; ファイルはコンパイルされたバイナリの作業ディレクトリに対して相対的に開かれます。私の場合、バイナリがコンパイルされた場所からの相対パスでファイルを開きたいのです。今にして思えば、これは設計上の悪い判断です)。

どのように解決するのですか?

うーん...その path/filepath パッケージには Abs() があり、ちょっと不便ですが、(今のところ)必要なことはできています。

absPath, _ := filepath.Abs("../mypackage/data/file.txt")

次に absPath を使ってファイルを読み込むと、正常に動作します。

なお、私の場合、データファイルはパッケージとは別に main パッケージとは別のパッケージにあります。もしすべて同じパッケージ内にあるのなら、先頭の ../mypackage/ . このパスは明らかに相対的なものなので、異なるプログラムは異なる構造を持ち、それに応じてこれを調整する必要があります。

Go プログラムで外部リソースを使用し、移植性を維持するためのより良い方法があれば、遠慮なく別の回答を投稿してください。