2016-07-28 3 views
0

Я довольно новичок, чтобы пойти и попытаться написать DNS-сервер, используя пакет miekg DNS. По его example, я копирую & вставили простой фрагмент кода, чтобы выполнить запрос Рекордное:Что означает 'key, ok: = k. (* Dns.A)' означает в Go?

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) вернуть две переменные?

ответ

2

Выражение k.(*dns.A) является type assertion.

Код утверждает, что k содержит *dns.A. Первое возвращаемое значение имеет тип *dns.A. Второе возвращаемое значение - это нетипизированное значение bool, указывающее, выполняется ли это утверждение.

Смежные вопросы