經常寫 shell 腳本的同學一定用過一個名為 basename 的程式。這個程式可以把一個路徑裡最後一部分提取出來,像下面這樣:
圖1 basename 運作結果
接下來你懂的,用 go 來實作這個 basename 程式。
本文的程式路徑是:
gopl/basictypes/basename
1. 版本一
package main
import (
"fmt"
"os"
)
func main() {
if len(os.Args) <= 1 {
usage()
os.Exit(-1)
}
s := basename(os.Args[1])
fmt.Println(s)
}
func basename(s string) string {
// 處理隻有一個 "/" 的情況
if len(s) == 1 && s[0] == '/' {
return s
}
// 最後一個字元是 '/' 則跳過
if len(s) > 0 && s[len(s)-1] == '/' {
s = s[:len(s)-1]
}
for i := len(s) - 1; i >= 0; i-- {
if s[i] == '/' {
s = s[i+1:]
break
}
}
return s
}
func usage() {
fmt.Println("go run basename01.go <path>")
}
2. 版本二
package main
import (
"fmt"
"os"
"strings"
)
func main() {
if len(os.Args) <= 1 {
usage()
os.Exit(-1)
}
s := basename(os.Args[1])
fmt.Println(s)
}
func basename(s string) string {
// 處理隻有一個 "/" 的情況
if len(s) == 1 && s[0] == '/' {
return s
}
// 最後一個字元是 '/' 則跳過
if len(s) > 0 && s[len(s)-1] == '/' {
s = s[:len(s)-1]
}
i := strings.LastIndexByte(s, '/')
s = s[i+1:]
return s
}
func usage() {
fmt.Println("go run basename02.go <path>")
}
3. 總結
- 熟悉 strings 包
- Tips: