2016-07-28 42 views
0

我對Go非常陌生,並試圖通過使用包 miekg DNS來編寫DNS服務器。據其example,我複製&粘貼簡單的代碼片段來執行記錄請求:在Go中,'key,ok:= k。(* dns.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似乎一樣kk.(*dns.A)怎麼能返回兩個變量?

回答

2

表達式k.(*dns.A)type assertion。代碼斷言k包含*dns.A。第一個返回值是*dns.A。第二個返回值是指明斷言是否成立的無類型布爾值。