dqqt31923 2016-07-28 00:23
浏览 67
已采纳

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

I am pretty new to Go and trying to write a DNS server by using package miekg DNS. According its example, I copy & pasted a simple snippet to perform A record request:

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
", key)
        }
    }
}

Loading by godebug, stopped at _ = "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
", 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

According godebug, ok == true and key seemed same as k. How could k.(*dns.A) return two variables?

  • 写回答

1条回答 默认 最新

  • dougong5817 2016-07-28 00:29
    关注

    The expression k.(*dns.A) is a type assertion.

    The code asserts that k contains a *dns.A. The first return value is of type *dns.A. The second return value is a untyped bool indicating whether the assertion holds.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料