天天看點

033-basename 程式

經常寫 shell 腳本的同學一定用過一個名為 basename 的程式。這個程式可以把一個路徑裡最後一部分提取出來,像下面這樣:

033-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: