# Go 标准库 flag 模块应用
参考[Go语言标准库》一书的对应章节:flag – 命令行参数解析](https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter13/13.1.html?q=)。
作为普通玩家不需要过多的了解 flag 背后是如何实现的,可以直接拿来用。
## 使用流程
- 定义一个命令行参数
- flag.Xxx():Xxx可以是Int、String等;返回一个相应类型的指针
```
var ip = flag.Int("flagname", 1234, "help message for flagname")
```
- flag.XxxVar():将flag绑定到一个变量上
```
var flagvar int
flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
```
- 解析参数
```
flag.Parse() // 通常会放到 func init() 函数体中,先于 main 函数执行
```
- 程序中使用参数
`flag.Xxx()` 方式的定义,返回值是一个指针,需要使用 `*` 获取指针指向的值(如上的 *ip);
`flag.XxxVar()` 方式的定义,绑定了一个变量,直接引用该变量即可。
- 命令行参数格式
命令行中需要在我们定义的*命令行参数*前加入 `-` 来指定参数。命令行参数指定支持下面 3 种方式:
- `-flag` // 只支持bool类型
- `-flag=value`
- `-flag value` // 只支持非bool类型
示例:
```
$ nginx -h
```
## 示例程序
```
package main
import (
"flag"
"fmt"
"os"
)
var (
arg_help bool
arg_host string
arg_port int
)
func init() {
flag.BoolVar(&arg_help, "h", false, "this help")
flag.StringVar(&arg_host, "H", "127.0.0.1", "Appoint the host of remote tcp server")
// 另一种绑定方式
var _port = flag.Int("P", "8080", "Appoint the port of remote tcp server")
flag.Parse()
arg_port = *_port
fmt.Printf("Input port arg: %d\n", arg_port)
}
func main() {
if arg_help {
fmt.Println("This is a tcp client demo, command line is as tcp_client [-H 127.0.0.1] [-P 8080]")
}
fmt.Println("Host:", arg_host, "Port:", arg_port)
}
```
将上面的代码保存为 tcp_client.go,然后使用命令 `go run tcp_client.go -H 192.168.1.100 -P 8081` 运行,如下所示:
```
ubuntu@VM-16-11-ubuntu:~/work/GoNote/TrainingCode/flag$ go run tcp_client.go -H 192.168.1.100 -P 8081
Input port arg: 8081
Host: 192.168.1.100 Port: 8081
```
相信你看完就知道怎么用了。