2016-07-28 7 views
0

私はかなり進んで、 miekg DNSパッケージを使ってDNSサーバーを作成しようとしています。そのexampleよると、私は、レコード要求を実行するための&貼り付け簡単なスニペットをコピーします。godebugによって「キー、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) 
     } 
    } 
} 

ロードは、_ = "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 == truekeykと同じように見えました。 k.(*dns.A)はどのようにして2つの変数を返しますか?

答えて

2

k.(*dns.A)は、type assertionです。

コードでは、kには*dns.Aが含まれています。最初の戻り値の型は*dns.Aです。 2番目の戻り値は、アサーションが成立するかどうかを示す型なしのブール値です。

関連する問題