我不确定如何确切地表达这个问题,而且我看到其他人提出了类似的问题,但没有真正给出答案(这告诉我我问了错误的问题,但我不知道如何解决这个问题)。
我正在尝试学习一些基本的 Go,但在第一个障碍上就遇到了困难。
在我的测试代码中,我对一个不存在的域执行基本的 http GET 操作,以触发 DNS 警告。我发现 err.error() 返回一个字符串,因此为了断言它是否是 DNS 错误,我使用了字符串比较:
resp, err := http.Get(link)
if err != nil {
if strings.Contains(err.Error(), "no such host") == true {
return "no such host"
}
}
Run Code Online (Sandbox Code Playgroud)
这显然是很hacky,所以我做了一些谷歌搜索,看看是否有更好的方法来找出引发了什么样的错误,我发现了以下答案:
包“errors”具有 As 功能,用于解包特定的错误类型,包“net”具有 *DNSError 类型。所以:
var dnsErr *net.DNSError
if errors.As(err, &dnsErr) {
...
}
Run Code Online (Sandbox Code Playgroud)
这段代码有效,但我完全不知道这个结论是如何得出的。以下是我试图理解这一点的方法,我想知道我哪里出错了。我(模糊地)理解 .Is() 和 .As() 正在做什么,但我不明白的是如何计算出什么错误“类型”来提供这些函数而无需猜测或先验知识。
我查看了 client.get() 文档,其中写着:
任何返回的错误都将是 *url.Error 类型。
更多的谷歌搜索,我发现我需要将错误转换为该类型才能使用它:
urlErr := err.(*url.Error)
Run Code Online (Sandbox Code Playgroud)
*url.Error 包含:
&url.Error{Op:"Get", URL:"http://doesnotexistkjdfhgsdfsdf.com", Err:(*net.OpError)(0xc00021a2d0)}
Run Code Online (Sandbox Code Playgroud)
所以我然后查看 url.Error 中包含的 …