Go
golang

Go 言語の path と path/filepath の違い

Go 言語の path と path/filepath の違い

Go 言語でのプログラミング中に Delphi のChangeFileExt、.NET Framework のPath.ChangeExtensionに相当するものが欲しくなって調べたところ、ビルトインには残念ながら無いようだった.
そして不思議なことに渡したpathの拡張子を取得する関数が2つある.
path.Extfilepath.Extだ.

それぞれのパッケージの Overview を読むにpathパッケージはパスの区切り文字として/を固定で用い、path/filepathはOS定義の文字を用いるようだ. 確かにpath.Extを読むと/が固定で用いられており、filepath.ExtではIsPathSeparatorを使用していた.

IsPathSeparatorhttps://golang.org/src/os/path_windows.go#L13https://golang.org/src/os/path_unix.go#L15に定義されているとおりである.

正直なところ、Linux でアプリを書いている人がpathパッケージを使って、Windowsでビルドしても動かないトラブルを起こす可能性が増えるだけなので/固定のビルトイン関数は廃止してほしいと思った.

それはさておき拡張子を置換するコードはこうなった.

func changeExt(path string, ext string) string {
    return path[:len(path)-len(filepath.Ext(path))] + ext
}

Python だったらスライスを取るときに負の値が使えてpath[:-len(filepath.Ext(path))]で済むのになーと思った.