/** * Created by GoLand. * User: link1st * Date: 2019-07-25 * Time: 17:27 */ package helper import ( "net" ) // 获取服务器Ip // func GetServerIp() (ip string) { // addrs, err := net.InterfaceAddrs() // if err != nil { // return "" // } // for _, address := range addrs { // // 检查ip地址判断是否回环地址 // if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { // if ipNet.IP.To4() != nil { // ip = ipNet.IP.String() // } // } // } // return // } /**** 问题:我在本地多网卡机器上,运行分布式场景,此函数返回的ip有误导致rpc连接失败。 遂google结果如下: *** 1、https://www.jianshu.com/p/301aabc06972 *** 2、https://www.cnblogs.com/chaselogs/p/11301940.html ****/ func GetServerIp() string { ip, err := externalIP() if err != nil { return "" } return ip.String() } func externalIP() (net.IP, error) { ifaces, err := net.Interfaces() if err != nil { return nil, err } for _, iface := range ifaces { if iface.Flags&net.FlagUp == 0 { continue // interface down } if iface.Flags&net.FlagLoopback != 0 { continue // loopback interface } addrs, err := iface.Addrs() if err != nil { return nil, err } for _, addr := range addrs { ip := getIpFromAddr(addr) if ip == nil { continue } return ip, nil } } return nil, err } func getIpFromAddr(addr net.Addr) net.IP { var ip net.IP switch v := addr.(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP } if ip == nil || ip.IsLoopback() { return nil } ip = ip.To4() if ip == nil { return nil // not an ipv4 address } return ip }