上一篇文章有教大家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协议。
文章作者:沃航科技