大概就是 Golang 要使用的,做完 dockerlize 後通常都會用 ENV 來做設定參數的部分,但又會希望增加類似 flag(stdin) 的方式來做參數,順便解釋一下 ENV 和 flag 的差別
# 在 ~/.profile 或類似 ~/.bashrc 內增加
export CLICOLOR=1
# 這個叫 ENV,而 flag 會類似實行後塞在後面的,類似
$ ls -al
# 其中的 -al 就是 flag,其實也就是 stdin 就是
而 Golang 中已經有個叫做 flag 的 lib 了,甚至打入 --help
就可以出說明,相關的 doc 在這邊
但我還想要有 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)
}
大概就這樣而已唄 : )