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のファイル操作にしか使わないものにしか使えなさそうですね。