网络上的答案获取的ip是服务器的ip或者获取本地ip,然后通过ip获取详细地址,要么报错,要么或者客户端的位置不正确…直接给我整麻了~
网络答案:
获取局域网ip

func GetOutBoundIP() (ip string, err error) {
	conn, err := net.Dial("udp", "8.8.8.8:53")
	if err != nil {
		fmt.Println(err)
		return
	}
	localAddr := conn.LocalAddr().(*net.UDPAddr)
	ip = strings.Split(localAddr.String(), ":")[0]
	return
}

获取外网能访问的动态ip,获取的是本机的ip不是客户端的ip

func GetOutBoundIP(ctx iris.Context) (ip string, err error) {
	resp, err := http.Get("http://myexternalip.com/raw")
	if err != nil {
		return "",err
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	ip = string(body)
	return
}

后来发现以上都不适合或者客户端ip

获取客户端ip
//通过iris的context内部函数获取请求头部获取ip
func GetOutBoundIP(ctx iris.Context) (string, error) {
	//从请求头部的X-REAL-IP获取Ip
	ip := ctx.Request().Header.Get("X-REAL-IP")
	netIP := net.ParseIP(ip)
	if netIP != nil {
		return ip, nil
	}

	//从请求头部的X-FORWARDED-FOR获取Ip
	ips := ctx.Request().Header.Get("X-FORWARDED-FOR")
	splitIps := strings.Split(ips, ",")
	for _, ip := range splitIps {
		netIP := net.ParseIP(ip)
		if netIP != nil {
			return ip, nil
		}
	}

	//从请求头部的RemoteAddr获取Ip
	ip, _, err := net.SplitHostPort(ctx.Request().RemoteAddr)
	if err != nil {
		return "", err
	}
	netIP = net.ParseIP(ip)
	if netIP != nil {
		return ip, nil
	}
	return "", fmt.Errorf("正确ip获取失败")
}