Go言語でクロスプラットフォーム的にパスとファイル名を結合するには?
2017/10/24
Go言語は言わずもがなクロスプラットフォーム対応の言語です。クロスコンパイルができて、Javaが「Write once, run anywhere」なら、Go言語は「Write once, compile anything」ってところでしょうか。
そんなGo言語ですが、プログラムコードの中で「パスとファイル名を結合するにはどう表現すればいいか?」と悩んでしまいます。
先に言っておくと、この記事は最終的に解決できていません。「力技でこのように回避している」程度です。もっと良い方法があったら誰か教えてください。
■2017/10/24 追記:Twitterで教えてもらいました!自称mattnさんありがとうございました!
[ad#top-1]
変数pにカレントディレクトリを入れたとします。※とりあえず間違ってたやり方を残しておきます。正解はそのあと。
p, _ := os.Getwd()
変数fにそのファイル名を入れたとします。
f := "test.txt"
この2つの変数を合体させる場合(つまりファイル”test.txt”の絶対パスを表現したい場合)、どのようにすれば良いのでしょうか?
Windowsだったら、
pf := p +"\\"+ f
Linuxだったら
pf := p +"/"+ f
となります。
なので、OSを判別して…
var pf string if runtime.GOOS == "windows" { pf = p +"\\"+ f }else if runtime.GOOS == "linux"{ pf = p +"/"+ f }
とやっています。なんか微妙ですね。
■2017/10/24 追記■
ということで正解を書きます。Twitterで以下のようなご指摘をいただきました。
filepath.Join 使って下さい。 / “Go言語でクロスプラットフォーム的にパスとファイル名を結合するには? | 非IT企業に勤める中年サラリーマンのIT日記” https://t.co/ehXCf0u8X9
— 自称mattn (@mattn_jp) 2017年10月24日
こちらがパスとファイル名を結合するコードとなります。
package main import ( "fmt" "os" "path/filepath" ) func main() { p, _ := os.Getwd() fname := filepath.Join(p, "test.txt") fmt.Println(fname) }
この通りちゃんと統合できました。
ちなみに、path/filepathパッケージについて、こちらで詳しく書かれています。
[ad#ad-1]
スポンサーリンク