无法正确取消引用指针并从内存地址数组中获取实际值

时间:2014-06-08 12:40:28

标签: pointers go

我在过去几天开始选择Go,主要依赖于语言规范和包文档,但是我在解析 net.LookupNS 的正确用法时遇到了问题。 由于它是指针类型,返回NS服务器值的内存地址数组,我想访问实际值/取消引用数组。

该计划:

package main

import "fmt"
import "net"
import "os"

var host string

func args() {
    if len(os.Args) != 2 {
        fmt.Println("You need to enter a host!")
    } else {
        host = os.Args[1]
    }
    if host == "" {
        os.Exit(0)
    }
}

func nslookup() []*net.NS {
    nserv, err := net.LookupNS(host)
    if err != nil {
        fmt.Println("Error occured during NS lookup", err)
    }
    return *&nserv
}

func main() {
    args()
    fmt.Println("Nameserver information:", host)
    fmt.Println("   NS records:", nslookup())
}

例如google.com,它显示以下内容:

Nameserver information: google.com
   NS records: [0xc2100376f0 0xc210037700 0xc210037710 0xc210037720]

我希望看到取消引用的值,而不是内存地址位置,例如:

   NS records: ["ns1.google.com", "ns2.google.com", "ns3.google.com", "ns4.google.com"]

现在显然,我更喜欢它们作为字符串的数组/切片,但问题是我可以获得实际名称服务器的唯一方法如下:

func nslookup() *net.NS {
  // The rest of the function
return *&nserv[0] // This returns the first nameserver

以上内容将返回以下内容:

Nameserver information: google.com
   NS records: &{ns1.google.com.} 

虽然这至少返回实际值而不是内存地址,但它需要索引,这不是非常灵活,并且它没有以非常用户友好的格式进行格式化。 此外,无法将[] * net.NS结构直接转换为字符串。

问题: 如何获取一个名称服务器数组,而不是内存地址,最好是一个字符串数组/片?

1 个答案:

答案 0 :(得分:5)

好几个问题:

  • 你为什么要回归*&nserv? Go不是C,请停止您正在做的所有事情并阅读Effective Go

  • 您的nslookup函数会返回*net.NS切片,这是一个指针切片,所以fmt.Println正在打印正确的内容,如果您需要更多详细信息,可以使用fmt.Printf%#v%#q修饰符来查看数据的实际效果。

示例:

package main

import "fmt"
import "net"
import "os"

var host string

func nslookupString(nserv []*net.NS) (hosts []string) {
    hosts = make([]string, len(nserv))
    for i, host := range nserv {
        hosts[i] = host.Host
    }
    return
}

func nslookupNS(host string) []*net.NS {
    nserv, err := net.LookupNS(host)
    if err != nil {
        fmt.Println("Error occured during NS lookup", err)
    }
    return nserv
}

func init() { //initilizing global arguments is usually done in init()
    if len(os.Args) == 2 {
        host = os.Args[1]
    }
}

func main() {
    if host == "" {
        fmt.Println("You need to enter a host!")
        os.Exit(1)
    }
    fmt.Println("Nameserver information:", host)
    ns := nslookupNS(host)
    fmt.Printf("   NS records String: %#q\n", nslookupString(ns))
    fmt.Printf("   NS records net.NS: %q\n", ns)
    for _, h := range ns {
        fmt.Printf("%#v\n", h)
    }

}