Go 为什么http.Get(“http://[:]:1234”)可以工作?

Go 为什么http.Get(“http://[:]:1234”)可以工作?,go,ip,Go,Ip,我在写一个测试,我想让HTTP服务器监听一个随机端口,然后连接到这个端口。我写道: mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println("foo") }) listener, err := net.Listen("tcp", ":0") fmt.Println(err) httpServer := &http.Serve

我在写一个测试,我想让HTTP服务器监听一个随机端口,然后连接到这个端口。我写道:

mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Println("foo")
})

listener, err := net.Listen("tcp", ":0")
fmt.Println(err)

httpServer := &http.Server{Handler: mux}
go httpServer.Serve(listener)

fmt.Println("http://" + listener.Addr().String())  

r, err := http.Get("http://" + listener.Addr().String())
fmt.Println(r)
fmt.Println(err)
我本想写
net.Listen(“tcp”,“127.0.0.1:0”)
,但不小心写了
net.Listen(“tcp”,“127.0.0:0”)

对于
“http://”+listener.Addr().String()
,它将打印:

据我所知,“括号-冒号-括号”是指“所有接口”

令我惊讶的是,
http.Get(“http://[:]:1709”)
可以工作,它连接到Web服务器并打印“foo”


“”是一个有效地址吗?

至少在Linux系统上是这样,这会导致连接到本地主机

地址
在6addr\u ANY中是
的,通常在侦听与系统上任何IPv6地址的连接时使用。它类似于IPv4中的
INADDR\u ANY
,也称为
0.0.0

偶尔有人试图使用这些地址中的一个作为传出连接的目标地址。发生这种情况时:

当与
0.0.0.0
建立传出连接时,Linux实际上是从
127.0.0.1
连接到
127.0.0.1

类似地,当与
::
建立传出连接时,Linux实际上从
::1
连接到
::1
。下面是一个例子,取自我的一个网站(它恰好是一个IP地址查找工具):

[error@murloc~]$curl-k-H“主机:myip.addr.space”https://[:]:8443/
::1
为完整起见,以下是IPv4版本:

[error@murloc~]$curl-k-H“主机:myip.addr.space”https://0.0.0.0:8443/
127.0.0.1

请注意,这是特定于操作系统的。你会收到的。

我在Windows上。那就有点奇怪了。我希望您会收到一个错误,与IPv4上的错误相同。也许微软在IPv6中做了一些改变。无论是
ping
还是
curl
还是Chrome都没有连接到IPv6,但Go确实如此。
http://[::]:1709