Go语言标准库 - flag(命令行参数解析)

Go语言内置了很是多具备经常使用功能的内置包,它们被称为标准库。我会在博客中以每篇文章一个标准库的方式记录我对标准库的理解和学习笔记。html

今天是第一篇:flag包,这个包是用来作命令行参数解析的。开发者常常会写一些命令行程序,因此参数解析是常见的需求。git

定义参数能够用flag.String()flag.Int()flag.Int()等,定义方式有2种:github

// 1. flag.XXX。其中XXX能够是Int、String和Bool等,其结果是相应类型的指针:
var q = flag.Bool("q", false, "Exit")  // 至关于 var q *bool
// 2. flag.XXXVar。就是在类型后面加`Var`,实际上是把flag绑定到对应类型的变量上:
var h bool
flag.BoolVar(&h, "h", false, "Show help")
复制代码

解析

定义彻底部参数后能够经过调用flag.Parse()进行解析。命令行语法有以下三种形式:golang

-flag // 只支持bool类型
-flag=x  // 任意类型
-flag x // 只支持非bool类型
复制代码

解析以后,flag的值能够直接使用:若是使用的是flag自身,它们是指针;若是绑定到了某个变量,它们是值:bash

fmt.Println("q is ", *q)
fmt.Println("h is ", h)
复制代码

一个简单的例子

用一个简单的例子先感觉下:函数

package main

import (
	"flag"
	"fmt"
	"os"
)

var (
	n int
    h bool
	q *bool
    s string
)

func init() {
	q = flag.Bool("q", false, "Exit")
	flag.BoolVar(&h, "h", false, "Show help")
	flag.IntVar(&n, "n", 0, "Set number")
	flag.StringVar(&s, "s", "Default string", "Set String")
}

func main() {
    flag.Parse()

    if h {
        flag.Usage()
    } else {
		if *q {
			fmt.Println("q is ", *q)
			os.Exit(0)
		}
		fmt.Println("Number is ", n)
		fmt.Println("String is ", s)
	}
}
复制代码

定义flag一般放在初始化函数init里面,在main函数中首先用flag.Parse解析参数。而后根据命令行的输入决定怎么显示:post

❯ go run simple.go  # 默认输出
Number is  0
String is  Default string
❯ go run simple.go -h  # 输出帮助信息
Usage of /var/folders/x6/vg82csf90dl3mnnqtbb32d580000gn/T/go-build470860288/b001/exe/simple:
  -h	Show help
  -n int
    	Set number
  -q	Exit
  -s string
    	Set String (default "Default string")
❯ go run simple.go -q
q is  true
❯ go run simple.go -q false  # 错误用法,false没有生效
q is  true
❯ go run simple.go -q=false  # 正确的用法
Number is  0
String is  Default string
❯ go run simple.go -n 10  # 指定n的值
Number is  10
String is  Default string
❯ go run simple.go -s abc  # 指定s的值
Number is  0
String is  abc
❯ go run simple.go -n 10 -s abc  # 同时指定n和s的值
Number is  10
String is  abc
❯ go run simple.go -n 10 -s abc -q  # 程序逻辑中,q为真时直接打印退出了,忽略了另外2个参数
q is  true
复制代码

flag在通常的状况下是够用的了。学习

代码地址

原文地址: strconv.com/posts/flag/ui

完整代码能够在这个地址找到。spa

延伸阅读

  1. golang.org/pkg/flag/
  2. books.studygolang.com/The-Golang-…
相关文章
相关标签/搜索