Go语言如何用DNS解析_Go语言net DNS解析教程【收藏】

雨敏吖_5677

雨敏吖_5677

2026-05-24

330人浏览

原创

net.lookupip适合快速验证域名解析,不支持超时、自定义dns或查mx/txt;必须用net.resolver的场景包括:指定dns服务器(如1.1.1.1)、需context超时控制、查非a记录(如lookupmx)、kubernetes headless service获取全量pod ip。

go语言如何用dns解析_go语言net dns解析教程【收藏】

直接用 net.LookupIP 就能查 A/AAAA 记录,但它不支持超时、不能指定 DNS 服务器、也不能查 MX/TXT;真要可控,必须上 net.Resolver。

什么时候该用 net.LookupIP,什么时候必须换 net.Resolver

net.LookupIP 适合本地调试、CI 脚本里快速验证域名是否可解析,或对行为没定制要求的场景。它走系统 resolver(/etc/resolv.conf 或 Windows API),自动处理双栈、重试和基础超时——但这些你完全没法干预。

以下情况必须切到 net.Resolver:

  • 要强制走 1.1.1.1:53 或内网 CoreDNS
  • goroutine 不能卡住:必须用 context.WithTimeout 控制查询耗时
  • 查 MX、TXT、CNAME 等非 A 记录,得调 LookupMX 等函数,它们底层只认 net.Resolver 实例
  • Kubernetes Headless Service 场景下要拿到全部 Pod IP,得显式调 resolver.LookupIP(ctx, "ip", domain),且不能传 "ip4",否则漏 IPv6
  • 传带端口的字符串(如 "example.com:443")会报 *net.DNSError,Err 字段是 "no such host",不是格式错误——net.LookupIP 只接受纯域名

net.Resolver 怎么设 DNS 服务器和超时

核心就两个字段:PreferGo 和 Dial。设 PreferGo: true 才真正绕过系统 resolver,启用 Go 自研 DNS 客户端;但光设这个没用,必须同时提供 Dial 函数,否则还是 fallback 到系统行为。

Dial 是个函数,不是地址字符串。正确写法是返回 net.Conn:

  • UDP 查 8.8.8.8:网络名用 "udp",地址写 "8.8.8.8:53"
  • TCP 查某些 DNS(比如自建服务):换 "tcp",但注意 Cloudflare/1.1.1.1 默认不响应 TCP 查询
  • Dial 里要用 net.Dialer{Timeout: 2 * time.Second}.DialContext,否则连接层超时不生效
  • 必须用 context.WithTimeout 包裹 LookupIP 调用,net.Resolver 本身不管理上下文超时

别漏掉错误判断:err 可能是 *net.DNSError,得用 .IsNotFound() 区分“域名不存在”,用 .IsTemporary() 判断是否临时失败(比如 UDP 丢包、防火墙拦截)。

IntoDNS.ai
IntoDNS.ai

免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。

下载

net.LookupHost 和 net.LookupIP 的关键区别

net.LookupHost 默认只返回 IPv4 字符串列表([]string),即使域名有 AAAA 记录也看不到 IPv6;而 net.LookupIP 返回 []net.IP,含 IPv4 和 IPv6,适合双栈服务连接。

常见误判:

  • net.LookupHost("google.com") 返回 ["142.250.191.46"],但 dig AAAA google.com 能看到 IPv6——这不是 bug,是设计如此
  • net.LookupIP 对 "localhost" 可能返回 127.0.0.1 和 ::1,LookupHost 通常只返回 "127.0.0.1"
  • 返回的 net.IP 是字节数组,IPv6 长度为 16 字节,别用 len(ip) 判断类型,应调 ip.To4() 或 ip.IsGlobalUnicast()

注意:net.Lookup* 系列函数全都不接受 context 或 timeout 参数,超时由系统 resolver 控制(如 glibc 的 RES_TIMEOUT)。想精确中断卡住的查询,只能靠 goroutine + channel + context.WithTimeout 套一层。

查非 A 记录必须用专用函数,不能靠 net.Resolver.LookupIP

Go 标准库没有泛型 DNS 查询接口。查不同记录类型,必须用对应函数:

  • LookupMX(ctx, name) 查邮件交换记录
  • LookupTXT(ctx, name) 查 TXT(SPF/DKIM 验证常用)
  • LookupCNAME(ctx, name) 只返回最终 canonical name,不返回中间跳转链
  • LookupSRV(ctx, service, proto, name) 用于微服务发现(如 _http._tcp.example.com)

这些函数底层都复用同一个 net.Resolver 实例,但参数和返回值完全不同。最容易错的是以为 LookupCNAME 能拿到完整 CNAME 链——它只返回最后一跳的目标名,且不保证该目标名本身还有 CNAME。

golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

go语言 dns

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.06

2649

5

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

2023.09.25

5267

6

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.13

662

5

0基础如何学go语言
0基础如何学go语言

0基础学习Go语言需要分阶段进行,从基础知识到实践项目,逐步深入。php中文网给大家带来了go语言相关的教程以及文章,欢迎大家前来学习。

2023.10.26

7025

20

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2476

5

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2724

5

go语言开发工具大全
go语言开发工具大全

本专题整合了go语言开发工具大全,想了解更多相关详细内容,请阅读下面的文章。

2025.06.11

5979

12

go语言引用传递
go语言引用传递

本专题整合了go语言引用传递机制,想了解更多相关内容,请阅读专题下面的文章。

2025.06.26

3817

12

go语言版本升级
go语言版本升级

本专题整合了go语言版本升级方法,想了解更多相关内容,请阅读专题下面的文章。

2025.06.27

6930

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程