Go语言net.LookupTXT返回‘no such host’,是否等价于无TXT记录?
Go中DNS查询"no such host"和"No TXT record"的区别及处理
不能把"no such host"错误等同于"无TXT记录",这是两种完全不同的DNS场景:
- "no such host":表示你查询的域名根本不存在(DNS服务器返回NXDOMAIN响应),此时该域名的所有DNS记录(A、AAAA、TXT等)都无法查到,本质是域名在DNS系统中没有被注册或配置。
- "No TXT record":指域名本身是存在的,但没有配置TXT类型的解析记录(DNS服务器返回NOERROR响应,但回答部分没有TXT记录)。
看你的测试代码,mail10476.emails3.rightmove.co.uk这个域名无论是用LookupHost还是LookupTXT都返回"no such host",说明这个域名本身就不存在,不是单纯的没有TXT记录。
如何区分并正确处理这两种情况
你可以通过类型断言解析Go返回的错误,或者先验证域名是否存在,再查询TXT记录:
package main import ( "fmt" "net" ) func main() { domain := "mail10476.emails3.rightmove.co.uk" // 先验证域名是否存在 _, err := net.LookupIP(domain) if err != nil { if dnsErr, ok := err.(*net.DNSError); ok && dnsErr.IsNotFound { fmt.Printf("域名 %s 不存在:%v\n", domain, err) return } fmt.Printf("IP记录查询失败:%v\n", err) return } // 域名存在时,查询TXT记录 txtRecords, err := net.LookupTXT(domain) if err != nil { fmt.Printf("TXT记录查询失败:%v\n", err) return } if len(txtRecords) == 0 { fmt.Println("No TXT record") } else { fmt.Printf("查询到TXT记录:%v\n", txtRecords) } }
补充说明
当域名存在但没有配置TXT记录时,LookupTXT通常会返回空的字符串切片且err为nil,这时候你需要通过判断切片长度来输出"No TXT record"提示;而如果域名不存在,所有类型的DNS查询都会返回"no such host"错误,这时候应该优先提示域名不存在,而非无TXT记录。
内容的提问来源于stack exchange,提问作者Skeeve
相关产品推荐
相关产品推荐

