flag包用来解析命令行参数

package main

import (
	"flag"
	"fmt"
	"strings"
)

// 根据不同的类型 接收不同的参数   变量名,默认值,解释
var (
	port           = flag.Uint("port", 8080, "The port to listen on.  Default 8080.")
	address        = flag.String("address", "127.0.0.1", "The address on the local server to listen to. Default 127.0.0.1")
)

func main() {
	flag.Parse() // 解析
	//fmt.Println(port)  // 0xc0000aa008 默认是指针
	//fmt.Println(*port) // 8080
	//// 执行方式  go run main.go -port 9090

	fmt.Println(address)  // 0xc000056270
	fmt.Println(*address) // 2.2.2.2 
	// 执行方式  go run main.go -address 2.2.2.2
}

flag.var 用来解析自定义的类型

package main

import (
	"flag"
	"fmt"
	"strings"
)

type StringList []string

// 注意 自定义的类型必须实现这两个方法
func (sl *StringList) String() string {
	return fmt.Sprint(*sl)
}

func (sl *StringList) Set(value string) error {
	for _, s := range strings.Split(value, ",") {
		if len(s) == 0 {
			return fmt.Errorf("value should not be an empty string")
		}
		*sl = append(*sl, s)
	}
	return nil
}

var (
	etcdServerList StringList // 声明类型
)

func init() {
	// 命令行参数 指针
	flag.Var(&etcdServerList, "etcd_servers", "Servers for the etcd (http://ip:port), comma separated")

}
func main() {
	flag.Parse()

	fmt.Println(etcdServerList) // go run main.go => []
	fmt.Println(etcdServerList)  // go run main.go -etcd_servers 192.168.1.1,192.168.2.3 => [192.168.1.1 192.168.2.3]

}