如何将用户输入为int的端口转换为类型为“:port”的字符串(即,它前面应该有一个':',应该转换为字符串)。输出必须提供给http.ListenAndServe()。
答案 0 :(得分:2)
类似的东西:
p := strconv.Itoa(port)
addr := ":" + p
// or for localhost only
// addr := "localhost:" + p
然后
if err := http.ListenAndServe(addr, nil); err != nil {
log.Fatal("ListenAndServe: ", err)
}
答案 1 :(得分:2)
if err := http.ListenAndServe(fmt.Sprintf(":%d", port), handler); err != nil {
log.Fatal(err)
}
答案 2 :(得分:1)
你可以(应该?)使用net.JoinHostPort(host, port string)
。
将port
转换为strconv.Itoa
的字符串。
它还将处理主机部分包含冒号的情况:“host:port”。直接将其反馈给ListenAndServe
。
以下是一些示例代码:
host := ""
port := 80
str := net.JoinHostPort(host, strconv.Itoa(port))
fmt.Printf("host:port = '%s'", str)
// Can be fed directly to:
// http.ListenAndServe(str, nil)
以上内容可以在游乐场上运行:https://play.golang.org/p/AL3obKjwcjZ
答案 3 :(得分:0)
我假设您正在使用类似flag.Int
的内容来获取int
。
不要将port int
作为参数,而是考虑使用address string
,其中地址可以是host[:port]
,其中port是可选的。
您可以使用这样的函数来确定是否指定了端口:
func hasPort(s string) bool {
return strings.LastIndex(s, ":") > strings.LastIndex(s, "]")
}
(以上内容来自/src/pkg/net/http/client.go)
这甚至可以用于IPv6地址。
使用该功能,您可以这样做:
if !hasPort(addr) {
addr += ":80"
}
log.Fatal(http.ListenAndServe(addr, nil))
如果你必须转换一个int,strconv.Itoa
就是你要走的路。您希望避免使用fmt
,因为它使用反射来确定类型,给定您已知道类型的静态类型。
就验证地址本身而言,如果地址不是net
所理解的格式,http
使用的error
包将发出net
,所以你只需抓住错误并用它做点什么。