我是 Go 的新手,正在尝试使用包 miekg DNS 编写 DNS 服务器.据其example ,我复制并粘贴了一个简单的片段来执行 A 记录请求:
package main
import "fmt"
import "github.com/miekg/dns"
func main() {
config, _ := dns.ClientConfigFromFile("/etc/resolv.conf")
c := new(dns.Client)
m := new(dns.Msg)
zone := "miek.nl"
m.SetQuestion(dns.Fqdn(zone), dns.TypeA)
m.SetEdns0(4096, true)
r, _, err := c.Exchange(m, config.Servers[0]+":"+config.Port)
if err != nil {
return
}
if r.Rcode != dns.RcodeSuccess {
return
}
_ = "breakpoint"
for _, k := range r.Answer {
if key, ok := k.(*dns.A); ok {
fmt.Printf("%+v\n", key)
}
}
}
通过 godebug 加载,在 _ = "breakpoint"
处停止:
./godebug run ~/aRequest.go -d /usr/local/go/
-> _ = "breakpoint"
(godebug) p r.Answer
[]dns.RR{(*dns.A)(0xc8200120c0)}
(godebug) n
-> for _, k := range r.Answer {
(godebug) n
-> if key, ok := k.(*dns.A); ok {
(godebug) p k
&dns.A{Hdr:dns.RR_Header{Name:"miek.nl.", Rrtype:0x1, Class:0x1, Ttl:0x708, Rdlength:0x4}, A:net.IP{0x8b, 0xa2, 0xc4, 0x4e}}
(godebug) n
-> fmt.Printf("%+v\n", key)
(godebug) p key
&dns.A{Hdr:dns.RR_Header{Name:"miek.nl.", Rrtype:0x1, Class:0x1, Ttl:0x708, Rdlength:0x4}, A:net.IP{0x8b, 0xa2, 0xc4, 0x4e}}
(godebug) p ok
true
根据 godebug,ok == true
和 key
似乎与 k
相同。 k.(*dns.A)
怎么会返回两个变量呢?
最佳答案
表达式 k.(*dns.A)
是一个 type assertion .
代码断言 k
包含一个 *dns.A
。第一个返回值是 *dns.A
类型。第二个返回值是一个无类型的 bool 值,指示断言是否成立。
关于go - 'key, ok := k.(*dns.A)' 在 Go 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38625233/