flag + ENV support

大概就是 Golang 要使用的,做完 dockerlize 後通常都會用 ENV 來做設定參數的部分,但又會希望增加類似 flag(stdin) 的方式來做參數,順便解釋一下 ENV 和 flag 的差別

# 在 ~/.profile 或類似 ~/.bashrc 內增加

export CLICOLOR=1

# 這個叫 ENV,而 flag 會類似實行後塞在後面的,類似

$ ls -al

# 其中的 -al 就是 flag,其實也就是 stdin 就是

而 Golang 中已經有個叫做 flag 的 lib 了,甚至打入 --help 就可以出說明,相關的 doc 在這邊

https://golang.org/pkg/flag/

但我還想要有 ENV 支援才行,所以以下 demo 把兩個打在一起就是

package main

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

/*
	flag 為官方內建 lib,用法其實是增加 --help / -h 的方式來問,類似這邊使用

		$ go run flag_env.go --help
		>   -host string
		>         host (default "0.0.0.0")
		>   -port uint
		>         port (default 8080)

		$ go run flag_env.go -port=9999
		> get config host :  0.0.0.0
		> get config port :  9999

	可用 argv 的方式來做設定,而有過 helpGetEnvXXX 的水,會把 ENV 改為預設值
	來讓 docker 之類的方便使用 ENV 來做設定,類似

	$ export CONFIG_HOST=9.9.9.9
	$ export CONFIG_PORT=9999
	$ go run flag_env.go --help
	>   -host string
	>         host (default "9.9.9.9")
	>   -port uint
	>         port (default 9999)

	$ go run flag_env.go -port=8888
	> get config host :  9.9.9.9
	> get config port :  8888

	以 command 的設定為最高優先權
*/

func helpGetEnvStr(key string, defaultStr string) string {
	tempStr := os.Getenv(key)
	if tempStr == "" {
		return defaultStr
	}
	return tempStr
}
func helpGetEnvUint(key string, defaultUint uint) uint {
	tempStr := os.Getenv(key)
	if tempStr == "" {
		return defaultUint
	}
	tempInt, err := strconv.Atoi(tempStr)
	if err != nil || tempInt < 0 || tempInt > 65535 {
		return defaultUint
	}
	return uint(tempInt)
}

var configHost = helpGetEnvStr("CONFIG_HOST", "0.0.0.0")
var configPort = helpGetEnvUint("CONFIG_PORT", 8080)

func init() {
	flag.StringVar(&configHost, "host", configHost, "host")
	flag.UintVar(&configPort, "port", configPort, "port")
	flag.Parse() //需置尾
}
func main() {
	fmt.Println("get config host : ", configHost)
	fmt.Println("get config port : ", configPort)
}

大概就這樣而已唄 : )

1個讚