🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### OverView ***** 学习以三种方式讲述 Go 语言如何接受命令行参数 * os.Args * flag * CLI * 命令行-子命令 ` ` ### **OS 获取命令行参数** ***** ``` os.Args # 为接受的参数,是一个切片 strconv.Atoi # 将字符串数值转换为整型 strconv.Itoa # 将整型转换为字符串 strconv.ParseFloat # 将字符串数值转换为浮点型 ``` ` ` ### **flag 获取命令行参数** ***** flag 包比 os 读取参数更方便。可以自定义传入的参数的类型:比如字符串,整型,浮点型,默认参数设置等 基本的使用方法如下: ``` var operate string flag.StringVar(&operate,"o", "add", "operation for calc") ``` 也可以这样定义为指针变量 ``` var operate := flag.String("o", "add", "operation for calc") ``` 注意:按照 flag 包的规则,在遇到非`-`开头的参数时,就停止解析了,其后面的参数都原封不动地全部放在`flag.Args()` ` ` ### **CLI 框架** ***** ``` package main import ( "fmt" "os" "github.com/urfave/cli/v2" ) func main() { app := &cli.App{ Flags: []cli.Flag{ &cli.StringFlag{Name: "X", Value: "GET", Usage: "请求方法"}, &cli.BoolFlag{Name: "i", Value: false, Usage: "是否包含完整输出"}, &cli.StringSliceFlag{Name: "H", Usage: "请求头"}, }, Action: func(c *cli.Context) error { fmt.Println(c.String("X")) fmt.Println(c.Bool("i")) fmt.Println(c.StringSlice("H")) fmt.Println(c.Args().First()) return nil }, } if err := app.Run(os.Args); err != nil { panic(err) } } ``` ` ` ### **命令行界面交互** ***** #### fmt.Scanf()来捕捉输入 ``` package main import "fmt" func main() { var guessColor string const favColor = "blue" for { fmt.Println("Guess my favorite color:") if _, err := fmt.Scanf("%s", &guessColor); err != nil { fmt.Printf("%s\n", err) return } if favColor == guessColor { fmt.Printf("%q is my favorite color!", favColor) return } fmt.Printf("Sorry, %q is not my favorite color. Guess again.\n", guessColor) } } ``` #### bufio.Scanner fmt.Scanf 对于简单的输入很有效,但是有时候我们可能需要一整行的数据。 ``` package main import ( "bufio" "fmt" "os" ) func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { line := scanner.Text() if line == "exit" { os.Exit(0) } fmt.Println(line) // Println will add back the final '\n' } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading standard input:", err) } } ```