非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

Go言語でクロスプラットフォーム的にパスとファイル名を結合するには?

      2017/10/24

Go言語は言わずもがなクロスプラットフォーム対応の言語です。クロスコンパイルができて、Javaが「Write once, run anywhere」なら、Go言語は「Write once, compile anything」ってところでしょうか。

そんなGo言語ですが、プログラムコードの中で「パスとファイル名を結合するにはどう表現すればいいか?」と悩んでしまいます。

先に言っておくと、この記事は最終的に解決できていません。「力技でこのように回避している」程度です。もっと良い方法があったら誰か教えてください。

■2017/10/24 追記:Twitterで教えてもらいました!自称mattnさんありがとうございました!

広告

変数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で以下のようなご指摘をいただきました。

 

こちらがパスとファイル名を結合するコードとなります。

package main

import (
  "fmt"
  "os"
  "path/filepath"
)

func main() {
  p, _ := os.Getwd()
  fname := filepath.Join(p, "test.txt")
  fmt.Println(fname)
}
 

 

この通りちゃんと統合できました。

 

ちなみに、path/filepathパッケージについて、こちらで詳しく書かれています。

 

 

広告

 - Go言語