上一篇文章有教大家go语言的反向代理服务,但是由于程序中几个重要参数都是固定的,因此如果要调整,就必须重新编译才行,如果能通过命令行参数动态指定这些参数,就能一个可执行文件完成不同配置了。
go语言获取命令行参数的方式如下:
package main import ( "fmt" "os" ) func main() { args := os.Args argslen := len (args) for i := 0 ; i < argslen ; i++ { fmt.Println(args[i]) } }
大家可以看到,命令行参数的获取依赖os包,获取得到后是个切片。
结合上一篇的反向代理代码,可修改为:
package main import ( "fmt" "net/http" "net/http/httputil" "net/url" "os" ) var host string = "localhost" var remoteurl string func ServeHTTP(res http.ResponseWriter, req *http.Request) { fmt.Println (req.URL) remote, err := url.Parse(remoteurl) if err != nil { panic(err) } proxy := httputil.NewSingleHostReverseProxy(remote) req.Host = host proxy.ServeHTTP(res, req) } func main() { port := "32236" protocol := "http://" args := os.Args argslen := len (args) for i := 0 ; i < argslen ; i++ { if args[i] == "-h" { host = args[i+1] } else if args[i] == "-p" { port = args[i+1] } else if args[i] == "-s" { protocol = "https://" } } remoteurl = protocol + host fmt.Println ("local port:", port) fmt.Println ("remoteurl:", remoteurl) http.HandleFunc("/", ServeHTTP) err := http.ListenAndServe(":" + port, nil); if err != nil { panic(err) } }
修改成这样后,软件就可以接收几个参数了。参数如下:
-p 指定本地端口
-h 指定对方域名
-s 使用https协议。
文章作者:沃航科技