在主块中捕获错误后,程序死机. panic:运行时错误:无效的内存地址或 nil 指针取消引用



我是golang的新手。在定义位置后尝试在主块中捕获错误后,我的程序会死机。 我在某处读过,添加 defer.close(( 可能会有所帮助,但编译器再次说您的结构中不存在这样的定义 帮助我解决它。

type IPInfo struct {
IP string
Hostname string
City string
Country string
Loc string
Org string
Postal string
}
func main() {
ip := getLocalIpv4()
location, err := ForeignIP(ip)
if err != nil {
fmt.Println("error bro")
}
fmt.Println("ip address of this machine is ", location.IP)
fmt.Println(" city of this machine is ", location.City)
}
// MyIP provides information about the public IP address of the client.
func MyIP() (*IPInfo, error) {
return ForeignIP("")
}
// ForeignIP provides information about the given IP address,
// which should be in dotted-quad form.
func ForeignIP(ip string) (*IPInfo, error) {
if ip != "" {
ip += "/" + ip
}
response, err := http.Get("http://ipinfo.io" + ip + "/json")
if err != nil {
return nil, err
}
defer response.Body.Close()
contents, err := ioutil.ReadAll(response.Body)
if err != nil {
return nil, err
}
var ipinfo IPInfo
if err := json.Unmarshal(contents, &ipinfo); err != nil {
return nil, err
}
return &ipinfo, nil
}
// retrieves ip address of local machine
func getLocalIpv4() string {
host, _ := os.Hostname()
addrs, _ := net.LookupIP(host)
for _, addr := range addrs {
if ipv4 := addr.To4(); ipv4 != nil {
return fmt.Sprintf("%s", ipv4)
}
}
return "localhost"
}

您的ForeignIP()返回*IPInfo,这是一个指针类型的结构,但您从这行代码中得到错误response, err := http.Get("http://ipinfo.io" + ip + "/json")由于以下错误而失败:

拨号TCP:查找ipinfo.io172.16.11.115:没有这样的主机。

然后你回到那边nil

if err != nil {
return nil , err
}

您可以访问 nil 的值为:

location, err := ForeignIP(ip)
fmt.Println("ip address of this machine is ", location.IP)
fmt.Println(" city of this machine is ", location.City)

因此nil值没有任何IP或变量City这就是它恐慌的原因。所以你需要返回指针类型的结构,然后你可以从location响应中访问变量IPCity,在这里我正在修改代码。

func ForeignIP(ip string) (*IPInfo, error) {
var ipinfo IPInfo
if ip != "" {
ip += "/" + ip
}
response, err := http.Get("http://ipinfo.io" + ip + "/json")
if err != nil {
return &ipinfo , err
}
defer response.Body.Close()
contents, err := ioutil.ReadAll(response.Body)
if err != nil {
return &ipinfo, err
}
if err := json.Unmarshal(contents, &ipinfo); err != nil {
return &ipinfo, err
}
return &ipinfo, nil
}

相关内容

最新更新