net.LookupIP适合本地调试、CI脚本验证或启动健康检查等无需定制的场景;传参必须为纯域名(如“github.com”),禁含端口、协议或路径,否则报“no such host”错误。

net.LookupIP 适合什么场景,传参要注意什么
直接用 net.LookupIP 就能查 A/AAAA 记录,它最省事,但只适合“不care细节”的场景——比如本地调试、CI 脚本里快速验证域名是否通,或服务启动时做一次基础健康检查。
它不接受带端口、协议、路径的字符串。传 "example.com:443" 或 "https://api.example.com" 会报 *net.DNSError,Err 字段是 "no such host",不是格式错误,而是系统 resolver 拿它当完整主机名去查了。
- 只传纯域名,如
"github.com" - 返回
[]net.IP,IPv4 是 4 字节,IPv6 是 16 字节;用ip.To4()判断是否 IPv4,别用len(ip) == 4 - 底层走系统 resolver(
/etc/resolv.conf或 Windows API),超时、重试、双栈行为都由系统控制,你没法改 - 查不到时返回非空 error,类型是
*net.DNSError,但err != nil不代表域名一定不存在——得看err.(*net.DNSError).IsNotFound()
必须用 net.Resolver 的 4 种典型情况
一旦涉及可控性,net.LookupIP 就不够用了。下面这些情况,硬上 net.Resolver 是唯一解:
- 要指定 DNS 服务器,比如强制走
"1.1.1.1:53"或内网 CoreDNS - goroutine 不能卡住:必须用
context.WithTimeout控制整体耗时(UDP 丢包时没超时会卡死) - 查 MX、TXT、CNAME 等非 A 记录——
net.LookupMX、net.LookupTXT这些函数底层只认net.Resolver实例,net.DefaultResolver不行 - Kubernetes Headless Service 场景下要拿到全部 Pod IP(含 IPv6),必须调
r.LookupIP(ctx, "ip", domain);传"ip4"会漏 IPv6 地址
net.Resolver 配置最容易漏掉的两个字段
Resolver.PreferGo = true 只是启用 Go 自研 DNS 客户端,**不是**自动指定 DNS 服务器。漏掉 Dial 函数,它仍 fallback 到系统 resolver,等于白设。
立即学习“go语言免费学习笔记(深入)”;
Dial 必须是函数,不是字符串地址。正确写法是返回 net.Conn:
Resolver: &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, addr string) (net.Conn, error) {
return (&net.Dialer{Timeout: 2 * time.Second}).DialContext(ctx, "udp", "1.1.1.1:53")
},
}- UDP 查 8.8.8.8:网络名用
"udp",地址写"8.8.8.8:53" - TCP 查询需换网络名
"tcp",但注意 Cloudflare/1.1.1.1 默认不响应 TCP 查询 -
Dialer.Timeout控的是连接建立超时,读写超时得靠net.Conn.SetReadDeadline—— 标准库没帮你设,得自己补 -
net.Resolver本身不管理 context 超时,LookupIP调用必须显式包裹context.WithTimeout
查 MX/TXT/CNAME 为什么不能靠 LookupIP
net.LookupIP 只返回 A/AAAA 地址,查其他记录必须用专用函数,且它们参数和返回值完全不同:
-
net.LookupMX(domain)返回[]*net.MX,MX.Target是域名,不是 IP,还得再查一次 -
net.LookupTXT(domain)返回[][]string,每条 TXT 记录可能被 EDNS 分片成多段,得拼起来 -
net.LookupCNAME(domain)只返回最终 canonical name,不返回跳转链;若无 CNAME,则 fallback 到 A 记录 - 所有这些函数都要求传入自定义
net.Resolver实例,net.DefaultResolver不支持
反向解析(IP → 域名)要用 net.LookupAddr,不是 net.LookupHost;后者传 IP 会原样返回,不是查 PTR 记录。


















