golang缓存DNS吗?

Is golang caching DNS?

我正在 运行 编写一段 golang 代码来解析 url。

这个 url 应该 returns 一个 ip 用于 50% 的请求,另一个 ip 用于其他 50%。

这在我执行 host 命令时有效,但在我使用 Go 解析 DNS 时无效。在我的研究中,我看到的每个答案都说 Golang 不缓存 DNS,但行为似乎有所不同。

谁能澄清一下?

这是我的代码,我正在使用 for 循环 运行 100 次:

for value in {1..100};do go run main.go;done

    "fmt"
    "net"
)

func main() {
    iprecords, _ := net.LookupIP("google.com")
    for _, ip := range iprecords {
        fmt.Println(ip)
    }
}

OS X 上使用 CGO_ENABLED=1(go build 默认值)时,根据 net package docsGo 将使用:

... the cgo-based resolver ... on systems that do not let programs make direct DNS requests (OS X)

因此,如果您在 MacOS 上观察 DNS 缓存 - 那么这是在 OS 级别发生的。

您可以尝试使用 Go 的本地 DNS 解析器,看看这是否是一个可行的替代方案。

您可以通过以下任一方式完成此操作:

CGO_ENABLED=0 go build  # disabling CGO

或更巧妙地使用运行时环境变量:

export GODEBUG=netdns=go    # force pure Go resolver

这有其局限性,例如在 VPN 拆分隧道 DNS 路由上使用 Go 的本地解析器将无法工作。 YMMV.