5

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

4

4 回答 4

4

你可以(应该?)使用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

于 2014-10-16T18:15:03.403 回答
3

采用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)
}
于 2013-07-12T05:28:07.353 回答
3
if err := http.ListenAndServe(fmt.Sprintf(":%d", port), handler); err != nil {
        log.Fatal(err)
}
于 2013-07-12T05:37:04.067 回答
-1

我假设您正在使用类似的东西flag.Int来获取int.

不要将port int其作为参数,address string而应考虑采用,其中地址可以是host[: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将发出一个,因此您只需捕获错误并对其进行处理。errornet

于 2013-07-12T17:49:49.467 回答