GOPATH に関係するファイルを開くにはどうしたらいいですか?
質問
私は
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 プログラムで外部リソースを使用し、移植性を維持するためのより良い方法があれば、遠慮なく別の回答を投稿してください。
関連
-
[解決済み] Goでマップにキーが含まれているかどうかを確認するには?
-
[解決済み] goで文字列の連結を効率的に行う方法
-
[解決済み] ゼロ終端のバイト配列を文字列に変換するにはどうすればよいですか?
-
[解決済み] GOPATHとGOROOTの値はどうすればよいですか?
-
[解決済み】gopathを使わずにローカルパッケージをインポートする方法
-
[解決済み] time.Sleepを使わずにすべてのゴルーチンが終了するのを待つには?
-
[解決済み] response.Bodyを閉じないとどうなりますか?
-
[解決済み] スライスを宣言するのか、スライスを作るのか?
-
[解決済み] テンプレートでマップを繰り返し処理する
-
[解決済み] Go オブジェクトのポインタ値を表示するにはどうすればよいですか?ポインタの値は何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ゴルーチンの停止方法
-
[解決済み] Goプログラムで静的リソースをバンドルする最良の方法は何ですか?
-
[解決済み] Goで関数の名前を取得するには?
-
[解決済み] os.Exit()とpanic()はいつ使うのか?
-
[解決済み] 現在時刻に時・分・秒を足す
-
[解決済み] テキストファイルを文字列配列に読み込む(そして書き込む)
-
[解決済み] Go で要件をインストールするにはどうすればよいですか? "パッケージが見つかりません"
-
[解決済み] GoのNull値
-
[解決済み] Go でローカル IP アドレスを取得するにはどうしたらいいですか?
-
[解決済み] 標準の http パッケージでカスタム 404 エラーページを表示する