对于go当中的cli简单理解

  使用go语言编写cli程序主要用到flag包,编程过程主要就三步,这里以编写一个显示当前日期的程序为例

// 显示当前时间
func showDate() {
    // 1. NewFlagSet 定义一个新的命令,在这里定义了一个显示日期的命令
    showDateCmd := flag.NewFlagSet("showdate", flag.ExitOnError)

    // 2. Parse 函数用于解析参数列表的命令,该函数必须在定义FlagSet之后程序访问命令之前调用
    err := showDateCmd.Parse(os.Args[2:])
    if err != nil {
        log.Panic(err)
    }

    // 3. Parsed 函数用来判断是否调用了Parse方法
    if showDateCmd.Parsed() {
        fmt.Println(time.Now())
    }
}

在这这三步中主要使用了三个方法NewFlagSet、Parse、Parsed。在这三步的基础上我们可以额外做一些事情,比如为一个命令添加一个参数,就像下面的程序一样,为calc命令添加了一个plus参数

// 加法
func calc() {
    sum := 0.0

    calcCmd := flag.NewFlagSet("calc", flag.ExitOnError)
    // 为命令添加一个参数
    calcPlus := calcCmd.String("plus", "", "两数相加")

    err := calcCmd.Parse(os.Args[2:])
    if err != nil {
        log.Panic(err)
    }

    if calcCmd.Parsed() {
        if *calcPlus == "" {
            fmt.Println("参数列表错误")
            os.Exit(1)
        }

        if len(os.Args[:]) > 3 {
            for i := 3; i < len(os.Args[:]); i++ {
                f, err := strconv.ParseFloat(os.Args[i], 64)
                if err != nil {
                    log.Panic(err)
                    fmt.Println("应该输入数字")
                } else {
                    sum += f
                }
            }
        }
        fmt.Printf("求和: %f", sum)
    }
}
附录 完整程序及运行截图
package main

import (
    "flag"
    "fmt"
    "log"
    "os"
    "strconv"
    "time"
)

// 显示当前时间
func showDate() {
    // NewFlagSet 定义一个新的命令,在这里定义了一个显示日期的命令
    showDateCmd := flag.NewFlagSet("showdate", flag.ExitOnError)

    // Parse 函数用于解析参数列表的命令,该函数必须在定义FlagSet之后程序访问命令之前调用
    err := showDateCmd.Parse(os.Args[2:])
    if err != nil {
        log.Panic(err)
    }

    // Parsed 函数用来判断是否调用了Parse方法
    if showDateCmd.Parsed() {
        fmt.Println(time.Now())
    }
}

// 加法
func calc() {
    sum := 0.0

    calcCmd := flag.NewFlagSet("calc", flag.ExitOnError)
    // 为命令添加一个参数
    calcPlus := calcCmd.String("plus", "", "两数相加")

    err := calcCmd.Parse(os.Args[2:])
    if err != nil {
        log.Panic(err)
    }

    if calcCmd.Parsed() {
        if *calcPlus == "" {
            fmt.Println("参数列表错误")
            os.Exit(1)
        }

        if len(os.Args[:]) > 3 {
            for i := 3; i < len(os.Args[:]); i++ {
                f, err := strconv.ParseFloat(os.Args[i], 64)
                if err != nil {
                    log.Panic(err)
                    fmt.Println("应该输入数字")
                } else {
                    sum += f
                }
            }
        }
        fmt.Printf("求和: %f", sum)
    }
}

func run() {
    switch os.Args[1] {
    case "showdate":
        showDate()
    case "calc":
        calc()
    default:
        fmt.Println("命令不存在")
        os.Exit(0)
    }
}

func main() {
    run()
}
View Code

猜你喜欢

转载自www.cnblogs.com/yishi-san/p/12592048.html