Ваш ForeignIP()
возвращает *IPInfo
, который является структурой типа указателя, но вы получаете сообщение об ошибке из этой строки кода response, err := http.Get("http://ipinfo.io" + ip + "/json")
, которое не удалось из-за ошибки ниже:
dialtcp: lookup ipinfo.io172.16.11.115: такого хоста нет.
Затем вы возвращаете nil
там, как.
if err != nil {
return nil , err
}
И вы получаете доступ к значению nilas:
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
, поэтому оно паникует.Поэтому вам нужно вернуть struct, которая имеет тип указателя, тогда вы можете получить доступ к переменным IP
и City
из ответа location
, здесь я изменяю код.
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
}