madokaのブログ

勉強したことのoutput先として使ってます。内容はpythonがらみが多いかもです。

golangでファイルパスを扱う際に気をつけたいこと

 きっかけ

golangの標準ライブラリを使って、ファイルパスを扱うコードを書きました。自分はMacを使っていたので問題はなかったのですが、同じコードをWindowsに持っていったら、ファイルパスがうまく取れない事態が発生。あまりにもびっくりだったので、ここでまとめます。

 

path (os.path)のファイルセパレーターは/だった

以下はpath.Splitのコードです。

func Split(path string) (dir, file string) {
    i := strings.LastIndex(path, "/")
    return path[:i+1], path[i+1:]
}

まさかのファイルセパレーターが/で指定されていました。Windowsの場合、ファイルセパレーターは\なのでここで見つからずに.になってしまっていました。

path.filepathを使おう

goの標準ライブラリにはpathで実装されているmethodを新たに実装してるものがあります。path.filepathです。 さきほど例に挙げたSplitはfilepathでは以下のようになっています。

func Split(path string) (dir, file string) {
    vol := VolumeName(path)
    i := len(path) - 1
    for i >= len(vol) && !os.IsPathSeparator(path[i]) {
        i--
    }
    return path[:i+1], path[i+1:]
}

こちらはセパレーターはosによって変化するようになっています。ファイルを扱う際にはこちらを使いましょう。

ちなみに

pathはもしや、urlの処理に使えるのではと頭によぎったので、入れてみました。

func main(){
  url := path.Join("http://localhost:8080","app")

  fmt.Println(url)
 // http:/localhost:8080/app

}

まさかのhttp://からスラッシュが1つ削られて使えなくなりした。

path.Cleanというmethodによって不要なセパレーターは排除されてしまうようです。

まとめ

まさか標準ライブラリに翻弄されるとは思いませんでした。 path - The Go Programming Languageを見に行ってみるとurlで記述するようなスラッシュを使っていて、Windowsには対応してません。と書いてありました。Macのファイル操作にしか使わないものにしか使えなさそうですね。