Go语言怎么做DNS查询_Go语言DNS域名解析教程【完整】
net.LookupIP 是最稳妥的 DNS A/AAAA 查询方式仅接受纯域名返回 []net.IP需用 net.Resolver 自定义 DNS 服务器、超时等非 A 记录需专用函数如 LookupMX标准库不提供超时重试缓存须自行封装。用 net.LookupIP 做基础 DNS A/AAAA 查询Go 标准库的 net.LookupIP 是最常用、也最稳妥的 DNS 查询入口它自动处理 IPv4/IPv6 双栈、系统默认 resolver如 /etc/resolv.conf、超时和重试逻辑。不需要额外依赖适合绝大多数服务发现、健康检查、白名单校验等场景。常见错误是直接传入带协议或端口的字符串比如 https://example.com:8080net.LookupIP 只接受纯域名example.com否则会报 lookup example.com:8080: no such host。域名必须不含 scheme、path、query、端口 —— 传 example.com别传 example.com:443返回的是 []net.IP不是字符串IPv4 地址长度为 4 字节IPv6 为 16 字节用 ip.To4() 或 ip.To16() 安全判断类型默认走系统 resolver不走 TCP fallback如果要强制 UDP/TCP 或指定 DNS 服务器得换 net.Resolver用 net.Resolver 控制 DNS 查询行为当需要绕过系统配置、指定 DNS 服务器比如 8.8.8.8、设置自定义超时、或强制使用 TCP 协议时net.Resolver 是唯一可控路径。它本质是 net.LookupIP 的“高级封装”但必须显式构造且容易漏掉关键字段。典型翻车点只设 PreferGo 却没配 Dial导致仍走系统 stub resolver或者 DialContext 返回的 net.Conn 没设读写超时整个查询卡死。立即学习“go语言免费学习笔记深入”Resolver.PreferGo true 仅启用 Go 自研解析器但不自动启用自定义 DNS —— 必须同时提供 Resolver.DialDial 函数里要用 net.DialTimeout(udp, 8.8.8.8:53, 2*time.Second)TCP 同理UDP 失败后不会自动切 TCP需自己封装重试逻辑并发查多个域名时Resolver 实例可复用但别在多个 goroutine 里共用未加锁的 sync.Pool 或 map 缓存结果 —— Go 的 net.Resolver 本身是线程安全的查 MX、TXT、CNAME 等非 A 记录得用 net.LookupMX 等专用函数Go 不提供泛型 DNS 查询接口比如类似 Python 的 dns.resolver.resolve(qname, TXT)每种记录类型都有独立函数LookupMX、LookupTXT、LookupNS、LookupCNAME。它们底层都调用同一套 resolver但参数和返回值完全不同。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能