登录
首页 >  Golang >  Go问答

在主块中捕获错误后,程序会出现恐慌。恐慌:运行时错误:无效的内存地址或零指针取消引用

来源:stackoverflow

时间:2024-03-30 12:36:31 204浏览 收藏

你在学习Golang相关的知识吗?本文《在主块中捕获错误后,程序会出现恐慌。恐慌:运行时错误:无效的内存地址或零指针取消引用》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

我是 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 值没有任何 ipcity 变量,这就是它恐慌的原因。所以你需要返回指针类型的struct,然后你可以从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
}

终于介绍完啦!小伙伴们,这篇关于《在主块中捕获错误后,程序会出现恐慌。恐慌:运行时错误:无效的内存地址或零指针取消引用》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>