TL;DR - net.LookupIP
可能根据 /etc/hosts
Map中的多个名称的顺序返回不同的地址列表(例如 127.0.0.1 my.local localhost
)。我不知道这是否应该令人惊讶;然而,我确实有一个 NATS 客户端以及 an official NATS sample client 故障发生在我身上,我想知道问题可能是什么。
您使用的 Go 版本是 ( go version
)?
go version go1.10 darwin/amd64
这个问题在最新版本中是否会重现?
最新版本。
您正在使用什么操作系统和处理器架构 ( go env
)?
darwin amd64
您做了什么?
- 使用以下测试代码:
package main
import (
"fmt"
"net"
)
func main() {
ips, _ := net.LookupIP("localhost")
fmt.Printf("IPs: %v\n", ips)
}
- 使用以下
/etc/hosts
:
127.0.0.1 localhost my.local # This line will be varied in the tests below
255.255.255.255 broadcasthost
::1 localhost
- 在更改
/etc/hosts
后运行测试程序四次,同时变化 1)解析器和 2)/etc/hosts
中localhost
和my.local
的顺序。(更改/etc/hosts
后运行sudo killall -HUP mDNSResponder
)。
# localhost FIRST (`127.0.0.1 localhost my.local`) and pure GO resolver:
$ GODEBUG=netdns=go+1 go run junk.go
go package net: GODEBUG setting forcing use of Go's resolver
IPs: [::1 127.0.0.1]
# localhost FIRST (`127.0.0.1 localhost my.local`) and CGO resolver:
$ GODEBUG=netdns=1 go run junk.go
go package net: using cgo DNS resolver
IPs: [::1 127.0.0.1]
# localhost SECOND (`127.0.0.1 my.local localhost`) and pure GO resolver:
$ GODEBUG=netdns=go+1 go run junk.go
go package net: GODEBUG setting forcing use of Go's resolver
IPs: [::1 127.0.0.1]
# localhost SECOND (`127.0.0.1 my.local localhost`) and CGO resolver:
$ GODEBUG=netdns=1 go run junk.go
go package net: using cgo DNS resolver
IPs: [127.0.0.1] # <---- This is the oddball; no IPv6 address
您期望看到什么?
我期望在所有四个测试中返回的 IP 集是相同的。
您实际看到了什么?
localhost
-last 和 cgo
的组合导致解析了不同的地址集。
3条答案
按热度按时间7z5jn7bk1#
@ianlancetaylor
oxf4rvwz2#
RFC 2782表示我们应该以伪随机顺序返回地址(参见“权重”的讨论)。我没有仔细查看,但我怀疑这就是发生在这里的情况。
o7jaxewo3#
IPs: [::1, 127.0.0.1]