こんにちは、kurumi-bioです。
第1回目の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
コードの説明
今回学習する関数は、全て与えられたパス文字列を変換して返す関数です。
ですので、それぞれの関数に同じパス文字列を渡して、どのような結果が返ってくるかを確認することで、各関数の動作の違いが明確になると思います。
パス文字列は、下記の6種類で、それぞれWindows表記とLinux(Unix)表記の記載を試します。
- ファイル名のみ
- ルートのみ
- フルパス
- 親階層に戻るパス
- ルートより上に戻るパス
- フォルダ名
Abs関数
func Abs(path string) (string, error)
package main import ( "fmt" "path/filepath" ) func printAbs(pathString string) { s, e := filepath.Abs(pathString) if e != nil { fmt.Printf("path=[%s]/ Abs Error : %v\n", s, e) } else { fmt.Printf("[%s] -> [%s]\n", pathString, s) } } func main() { printAbs("test") printAbs("c:/") printAbs("c:/test1/test1.txt") printAbs("c:/test2/test2-1/../test2.txt") printAbs("c:/test3/../../../test3.txt") printAbs("c:/test4/") printAbs("/") printAbs("/test5/test5.txt") printAbs("/test6/test6-1/../test6.txt") printAbs("/test7/../../../test7.txt") printAbs("/test8/") printAbs("") }
◆実行結果(Windows)
◆実行結果(Linux)
Base関数
func Base(path string) string
package main import ( "fmt" "path/filepath" ) func printBase(pathString string) { fmt.Printf("[%s] -> [%s]\n", pathString, filepath.Base(pathString)) } func main() { printBase("test") printBase("c:/") printBase("c:/test1/test1.txt") printBase("c:/test2/test2-1/../test2.txt") printBase("c:/test3/../../../test3.txt") printBase("c:/test4/") printBase("/") printBase("/test5/test5.txt") printBase("/test6/test6-1/../test6.txt") printBase("/test7/../../../test7.txt") printBase("/test8/") printBase("") }
◆実行結果(Windows)
◆実行結果(Linux)
Clean関数
func Clean(path string) string
package main import ( "fmt" "path/filepath" ) func printClean(pathString string) { fmt.Printf("[%s] -> [%s]\n", pathString, filepath.Clean(pathString)) } func main() { printClean("test") printClean("c:/") printClean("c:/test1/test1.txt") printClean("c:/test2/test2-1/../test2.txt") printClean("c:/test3/../../../test3.txt") printClean("c:/test4/") printClean("/") printClean("/test5/test5.txt") printClean("/test6/test6-1/../test6.txt") printClean("/test7/../../../test7.txt") printClean("/test8/") printClean("") }
◆実行結果(Windows)
◆実行結果(Linux)
Dir関数
func Dir(path string) string
package main import ( "fmt" "path/filepath" ) func printDir(pathString string) { fmt.Printf("[%s] -> [%s]\n", pathString, filepath.Dir(pathString)) } func main() { printDir("test") printDir("c:/") printDir("c:/test1/test1.txt") printDir("c:/test2/test2-1/../test2.txt") printDir("c:/test3/../../../test3.txt") printDir("c:/test4/") printDir("/") printDir("/test5/test5.txt") printDir("/test6/test6-1/../test6.txt") printDir("/test7/../../../test7.txt") printDir("/test8/") printDir("") }
◆実行結果(Windows)
◆実行結果(Linux)
最後に
単純な文字列操作ですので、自分で実装することも可能な感じもします。
例えば、ファイルパスからファイル名とパスを分離するときには、
Base関数
とDir関数
を使えば楽かなぁという感じで、他の関数は使い道がわからないです。
あえて、パス文字列に親ディレクトリ指定[..]を含んで指定することは無いかなぁと思っています。
最後までご覧いただきありがとうございます