gpt4 book ai didi

go - 程序在主程序 block 中发现错误后出现 panic 。 panic : runtime error: invalid memory address or nil pointer dereference

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:35 26 4
gpt4 key购买 nike

我是 golang 的新手。在定义位置后 try catch 主 block 中的错误后,我的程序出现 panic 。我在某处读过,添加 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") 由于以下错误而失败:

dial tcp: lookup ipinfo.io172.16.11.115: no such host.

然后你在那边返回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 变量,这就是它崩溃的原因。所以你需要返回指针类型的结构,然后你可以从 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
}

关于go - 程序在主程序 block 中发现错误后出现 panic 。 panic : runtime error: invalid memory address or nil pointer dereference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52645597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com