例によって行く: ファイルのパス

filepath パッケージは、オペレーティング システム間で移植可能な方法で *ファイル パス* を解析および構築するための関数を提供します。たとえば、Linux 上の dir/file と Windows 上の dir\file です。

package main
import (
    "fmt"
    "path/filepath"
    "strings"
)
func main() {

Join はポータブルな方法でパスを構築するために使用されます。任意の数の引数を取り、それらから階層パスを構築します。

    p := filepath.Join("dir1", "dir2", "filename")
    fmt.Println("p:", p)

/ または \ を手動で連結するかわりに、常に Join を使用する必要があります。ポータビリティに加えて、Join は余分な区切り文字やディレクトリの変更を削除することによってパスを正規化します。

    fmt.Println(filepath.Join("dir1//", "filename"))
    fmt.Println(filepath.Join("dir1/../dir1", "filename"))

DirBase はパスをディレクトリとファイルに分割するために使用できます。あるいは、Split はどちらも同じ呼び出しで返します。

    fmt.Println("Dir(p):", filepath.Dir(p))
    fmt.Println("Base(p):", filepath.Base(p))

パスが絶対かどうかチェックできます。

    fmt.Println(filepath.IsAbs("dir/file"))
    fmt.Println(filepath.IsAbs("/dir/file"))
    filename := "config.json"

一部のファイル名はドットに続いて拡張子が付いています。Ext を使用すると、そのような名前から拡張子を分離できます。

    ext := filepath.Ext(filename)
    fmt.Println(ext)

ファイル名から拡張子を除いたものを見つけるには、strings.TrimSuffix を使用します。

    fmt.Println(strings.TrimSuffix(filename, ext))

Rel は *ベース* と *ターゲット* の間の相対パスを見つけます。ターゲットをベースに対して相対的にできない場合は、エラーを返します。

    rel, err := filepath.Rel("a/b", "a/b/t/file")
    if err != nil {
        panic(err)
    }
    fmt.Println(rel)
    rel, err = filepath.Rel("a/b", "a/c/t/file")
    if err != nil {
        panic(err)
    }
    fmt.Println(rel)
}
$ go run file-paths.go
p: dir1/dir2/filename
dir1/filename
dir1/filename
Dir(p): dir1/dir2
Base(p): filename
false
true
.json
config
t/file
../c/t/file

次の例: ディレクトリ