emahiro/b.log

Drastically Repeat Yourself !!!!

os.Openするときの相対パスの書き方

goで os.Open(filename string) を実行するときに読み取りファイルを特定のディレクトリにまとめておいたときに os.Open で指定する相対パスがどう決まるかのメモです。

答えはmain.goからの相対パスになります。

例えば以下のようなディレクトリ構成のとき

- src
  - main.go
  - conf.json

conf.jsonを読み込むためには

f, err := os.Open("./conf.json")

となります。

次に以下のようなディレクトリ構成を考えます。

- Project
  - conf
    - conf.json
  - src
    - project
      - main.go

この場合は

f, err := os.Open("../../conf/conf.json")

となります。

main.goから見た相対パスだということを忘れていたので備忘録のために書きました。

[追記]

答えはmain.goからの相対パスになります。

ここが少し違っていてこれは実行ディレクトリから見たときの相対パスになります。

- Project
  - conf
    - conf.json
  - src
    - project
      - main.go

のようなディレクトリ構造の時

# ProjectRootで実行する
$ go run src/project/main.go

とする場合はconf以下のjsonを読み込もうと思ったら os.Open(./conf/conf.json) になります。
一方で

# projectディレクトリで実行する
$ go run main.go

と実行する場合は本エントリで書いたような相対パスになります。

どこで実行するかで書き方を変更する必要があります。