初心者のGo言語 -45- <IsAbs,IsLocal,Join,Match>
こんにちは、kurumi-bioです。
第3回目の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
コードの説明
ファイルパス文字列の操作を行う関数ですので、色々な形式のパスを渡して結果を確認してみました。
IsAbs関数
func IsAbs(path string) bool
package main import ( "fmt" "path/filepath" ) func printResult(pathString string) { b := filepath.IsAbs(pathString) fmt.Printf("\t%-20s -> [%t]\n", pathString, b) } func main() { println("◆ドライブ名で始まる(Windows形式)") printResult("c:\\") printResult("c:\\folder\\file") printResult("c:\\file") printResult("c:\\folder\\") printResult("c:/file") println("◆パス区切り文字で始まる(Linux形式)") printResult("/") printResult("/folder/file") printResult("/folder") printResult("/folder/") println("◆パス区切り文字で始まらない") printResult("folder/file") printResult("folder\\file") printResult("file.txt") printResult("folder\\") printResult("folder/") println("◆その他") printResult("file") printResult("") }
◆実行結果(Windows)
◆実行結果(Linux)
IsLocal関数
func IsLocal(path string) bool
package main import ( "fmt" "path/filepath" ) func printResult(pathString string) { b := filepath.IsLocal(pathString) fmt.Printf("\t%-20s -> [%t]\n", pathString, b) } func main() { println("◆ドライブ名で始まる(Windows形式)") printResult("c:\\") printResult("c:\\folder\\file") printResult("c:\\file") printResult("c:\\folder\\") printResult("c:/file") println("◆パス区切り文字で始まる(Linux形式)") printResult("/") printResult("/folder/file") printResult("/folder") printResult("/folder/") println("◆パス区切り文字で始まらない") printResult("folder/file") printResult("folder\\file") printResult("file.txt") printResult("folder\\") printResult("folder/") println("◆その他") printResult("file") printResult("") }
◆実行結果(Windows)
◆実行結果(Linux)
Join関数
func Join(elem ...string) string
package main import ( "fmt" "path/filepath" ) func printResult(n ...string) { var s string for _, v := range n { s += "[" + v + "]" } fmt.Printf("\t%-30s -> [%s]\n", s, filepath.Join(n...)) } func main() { println("◆ドライブ名で始まる(Windows形式)") printResult("c:", "folder", "file") printResult("c:/", "folder", "file") printResult("c:\\", "folder", "file") printResult("c:/", "folder", "", "file") println("◆パス区切り文字で始まる(Linux形式)") printResult("/", "folder", "file") printResult("/", "folder", "", "file") println("◆パス区切り文字で始まらない") printResult("folder", "file") println("◆UNC形式") printResult("//", "host", "folder", "file") printResult("\\\\", "host", "folder", "file") }
◆実行結果(Windows)
◆実行結果(Linux)
Match関数
func Match(pattern, name string) (matched bool, err error)
package main import ( "fmt" "path/filepath" ) func printResult(p, n string) { b, e := filepath.Match(p, n) if e != nil { fmt.Printf("\tMatch Error [%v] : pattern=[%s]/ name=[%s]\n", e, p, n) } else { if b == true { fmt.Printf("\tpattern=[%-10s]/name=[%5s]:一致\n", p, n) } else { fmt.Printf("\tpattern=[%-10s]/name=[%5s]:不一致\n", p, n) } } } func main() { println("◆任意の文字列") printResult("*", "abc") printResult("*", "a/c") printResult("b*", "abc") println("◆任意の1文字") printResult("a?c", "abc") printResult("a?", "abc") printResult("?", "/") printResult("?", "-") println("◆範囲内の1文字") printResult("a[a-z]c", "abc") printResult("a[c-z]c", "abc") printResult("a[A-Z]c", "abc") printResult("a[]c", "abc") println("◆完全一致") printResult("abc", "abc") printResult("a", "abc") printResult("a", "a") printResult("a-c", "a-c") printResult("[", "[") println("◆エスケープ文字") printResult("\\*bc", "*bc") printResult("\\?bc", "?bc") printResult("\\/bc", "/bc") }
◆実行結果(Windows)
◆実行結果(Linux)
最後に
今回、試した関数はWindows環境とLinux環境のパス文字列の差異を吸収する関数でした。
マルチプラットフォーム環境で使うモジュールを作成する場合は、この関数群を使うことでOSを意識することなく実装可能となります。
例えば、ログの出力先を指定する場合に、Join関数で設置(実行)フォルダの相対パス指定する実装するイメージです。
単純な文字列操作ですので自分で実装することもできますが、標準ライブラリーに任せておいた方が、将来新しいOSが出ても、標準ライブラリーで吸収してくれるので再実装不要となります。
最後までご覧いただきありがとうございます