【09】Go 标准库 flag 模块应用

Go 标准库 flag 模块应用

参考Go语言标准库》一书的对应章节:flag – 命令行参数解析

作为普通玩家不需要过多的了解 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

相信你看完就知道怎么用了。


这是一个从 https://studygolang.com/topics/10181 下的原始话题分离的讨论话题