こんにちは、kurumi-bioです。
第5回目のfilepathパッケージ(標準ライブラリー)の学習です。
前回の記事
APIリファレンス(過去記事の一覧)
環境
- Windows
OSバージョン:Windows11 Home 22H2
Go言語のバージョン:go version go1.20.3 windows/amd64 - Linux
OSバージョン:openSUSE Leap 15.4
Go言語のバージョン:go version go1.20.3 linux/amd64
VolumeName関数
func VolumeName(path string) string
package main import ( "fmt" "path/filepath" ) func printResult(p string) { v := filepath.VolumeName(p) fmt.Printf("\tpath=[%-25s] - valumeName[%-15s]\n", p, v) } func main() { fmt.Println("◆ドライブ名有り") printResult("c:\\test1\\test.txt") printResult("c:/test1/test.txt") fmt.Println("◆UNC形式") printResult("\\\\test1\\test2\\test.txt") printResult("//test1/test2/test.txt") fmt.Println("◆ドライブ名無し") printResult("\\test1\\test.txt") printResult("/test1/test.txt") }
◆実行結果(Windows)
◆実行結果(Linux)
Walk関数
func Walk(root string, fn WalkFunc) error
package main import ( "fmt" "io/fs" "path/filepath" ) func skipDirFunc(path string, info fs.FileInfo, err error) error { if err != nil { fmt.Printf("skipDirFunc Error:%v\n", err) return err } if info.Name() == "Skip" { fmt.Printf("\tSkip [%s]\n", path) return filepath.SkipDir } fmt.Printf("\t%s\n", path) return nil } func skipAllFunc(path string, info fs.FileInfo, err error) error { if err != nil { fmt.Printf("skipAllFunc Error:%v\n", err) return err } if info.Name() == "Skip" { fmt.Printf("\tSkipAll [%s]\n", path) return filepath.SkipAll } fmt.Printf("\t%s\n", path) return nil } func printResult(r string) { fmt.Println("◆All") e := filepath.Walk(r, func(path string, info fs.FileInfo, err error) error { if err != nil { fmt.Printf("Walk Error:%v\n", err) return err } fmt.Printf("\t%s\n", path) return nil }) if e != nil { fmt.Println(e) } fmt.Println("◆SkipDir") filepath.Walk(r, skipDirFunc) fmt.Println("◆SkipAll") filepath.Walk(r, skipAllFunc) } func main() { printResult("a") }
◆実行結果(Windows)
◆実行結果(Linux)
WalkDir関数
func WalkDir(root string, fn fs.WalkDirFunc) error
package main import ( "fmt" "io/fs" "path/filepath" ) func skipDirFunc(path string, d fs.DirEntry, err error) error { if err != nil { fmt.Printf("skipDirFunc Error:%v\n", err) return err } if d.Name() == "Skip" { fmt.Printf("\tSkipDir [%s]\n", path) return filepath.SkipDir } fmt.Printf("\t%s\n", path) return nil } func skipAllFunc(path string, d fs.DirEntry, err error) error { if err != nil { fmt.Printf("skipAllFunc Error:%v\n", err) return err } if d.Name() == "Skip" { fmt.Printf("\tSkipAll [%s]\n", path) return filepath.SkipAll } fmt.Printf("\t%s\n", path) return nil } func printResult(r string) { fmt.Println("◆All") e := filepath.WalkDir(r, func(path string, d fs.DirEntry, err error) error { if err != nil { fmt.Printf("WalkDir Error:%v\n", err) return err } fmt.Printf("\t%s\n", path) return nil }) if e != nil { fmt.Println(e) } fmt.Println("◆SkipDir") filepath.WalkDir(r, skipDirFunc) fmt.Println("◆SkipAll") filepath.WalkDir(r, skipAllFunc) } func main() { printResult("a") }
◆実行結果(Windows)
◆実行結果(Linux)
型定義 WalkFunc
type WalkFunc func(path string, info fs.FileInfo, err error) error
最後に
関数の引数に関数を使えるのは、色々と工夫できそうな感じがします。
引数を同じにすれば、別名で実装できますので、場合分けして使うことができそうです。
とはいえ、普通に関数内で呼び出すのと変わらない気がしますが、きっと何か意味があるのだと思います。
Go言語を使いこなせるようになれば、違いが判るのかと思います。
最後までご覧いただきありがとうございます