Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Go语言flag库的基本用法 #36

Open
kevinyan815 opened this issue Dec 22, 2020 · 0 comments
Open

Go语言flag库的基本用法 #36

kevinyan815 opened this issue Dec 22, 2020 · 0 comments

Comments

@kevinyan815
Copy link
Owner

kevinyan815 commented Dec 22, 2020

Go语言提供的flag库支持基础的命令行flag的解析。什么是命令行flag? 举个例子来说,常用的Linux命令wc -l这个-l就是wc命令支持的一个命令行flag。

下面是用Go语言的flag包编写的一个命令行Demo程序:

package main

import (
    "flag"
    "fmt"
)

func main() {

    wordPtr := flag.String("word", "Jude", "a string")

    numbPtr := flag.Int("numb", 42, "an int")
    boolPtr := flag.Bool("fork", false, "a bool")

    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

    flag.Parse()

    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *boolPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

使用flag包可以为程序声明字符串型、数字型、布尔型的命令行flag。

  • flag.String("word", "Jude", "a string")声明了一个字符串型的flag word,指定了它的默认值和简介。flag.String函数返回一个字符串型的指针(不是字符串值)。
  • 声明numbfork这两个flag的函数flag.Intflag.Bool,使用方法跟flag.String函数的一样。
  • flag.StringVar(&svar, "svar", "bar", "a string var")这个形式的函数可以把命令行flag参数值解析到程序中的已存变量,需要注意的是函数接受的是已存变量的指针。
  • 定义完所有的命令行flag后,调用flag.Parse()函数去执行命令行解析。
  • 上面的程序只是打印出了所有命令行flag的值以及位置参数的值。注意我们需要对wordPtr这几个存储了指针的变量进行解引用(*wordPtr)才能拿到具体的命令行flag值。

要使用制作的命令行程序,先把程序编译成二进制命令文件:

go build -o {目标目录}/go-cli-flags  {源文件目录}/{源文件.go}

执行命令时为每个flag指定值:

$ ./go-cli-flags -word=opt -numb=7 -fork -svar=flag

// 下面是命令执行后的输出
word: opt
numb: 7
fork: true
svar: flag
tail: []

执行命令时被忽略的flag会自动使用定义flag时指定的默认值。

$ ./go-cli-flags -word=opt

word: opt
numb: 42
fork: false
svar: bar
tail: []

执行命令时,在flag后可以传递任意多个位置实参

$ ./go-cli-flags -word=opt a1 a2 a3
word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3]

注意,flag包要求执行命令时所有命令行flag参数都要出现在位置实参的前面,否则命令行flag参数将会被理解成位置实参,比如下面这样

$ ./go-cli-flags -word=opt a1 a2 a3 -numb=7

word: opt
numb: 42
fork: false
svar: bar
tail: [a1 a2 a3 -numb=7]

使用-h或者--help可以获取自动为命令行程序生成的帮助文本

$ ./go-cli-flags  -h
Usage of ./go-cli-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

如果在执行程序时提供了程序未指定的flag,程序会报告错误信息并展示帮助文本。

$ ./go-cli-flags -wat
flag provided but not defined: -wat
Usage of ./go-cli-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

更多用flag库编写CLI程序的例子:https://www.digitalocean.com/community/tutorials/how-to-use-the-flag-package-in-go

@kevinyan815 kevinyan815 changed the title 用Go语言flag库开发命令行程序 flag库的基本用法 Dec 22, 2020
@kevinyan815 kevinyan815 changed the title flag库的基本用法 Go语言flag库的基本用法 Dec 22, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant