在Golang中将端口转换为:string类型的端口

时间:2013-07-12 05:16:49

标签: linux webserver go

如何将用户输入为int的端口转换为类型为“:port”的字符串(即,它前面应该有一个':',应该转换为字符串)。输出必须提供给http.ListenAndServe()。

4 个答案:

答案 0 :(得分:2)

使用strconv.Itoa()

类似的东西:

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 ,所以你只需抓住错误并用它做点什么。