go - 'key, ok := k.(*dns.A)' 在 Go 中是什么意思?

标签 go syntax

我是 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 == truekey 似乎与 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/

相关文章:

json - Golang 解码 json 列表

go - 在 Google BigQuery 中将数据插入表格的嵌套字段

python - 插入语法 SQL 的动态表 - Python

C++引用变量声明语法推理

C# 变量初始化与赋值

JavaScript 语法 : function calls and using parenthesis

loops - 在以下方面,WaitGroup不受双重尊重

go - Go 更喜欢从远程存储库获取还是更喜欢使用本地文件?

go - FileServer 处理未找到 css 并使用 MIME 类型错误而不是 404

syntax - Clojure中的匿名函数的fn和#语法之间有区别吗?