1 package main 2 3 import ( 4 "errors" 5 "fmt" 6 "net" 7 ) 8 9 func externalIP() (net.IP, error) { 10 ifaces, err := net.Interfaces() 11 if err != nil { 12 return nil, err 13 } 14 for _, iface := range ifaces { 15 if iface.Flags&net.FlagUp == 0 { 16 continue // interface down 17 } 18 if iface.Flags&net.FlagLoopback != 0 { 19 continue // loopback interface 20 } 21 addrs, err := iface.Addrs() 22 if err != nil { 23 return nil, err 24 } 25 for _, addr := range addrs { 26 ip := getIpFromAddr(addr) 27 if ip == nil { 28 continue 29 } 30 return ip, nil 31 } 32 } 33 return nil, errors.New("connected to the network?") 34 } 35 36 func getIpFromAddr(addr net.Addr) net.IP { 37 var ip net.IP 38 switch v := addr.(type) { 39 case *net.IPNet: 40 ip = v.IP 41 case *net.IPAddr: 42 ip = v.IP 43 } 44 if ip == nil || ip.IsLoopback() { 45 return nil 46 } 47 ip = ip.To4() 48 if ip == nil { 49 return nil // not an ipv4 address 50 } 51 52 return ip 53 } 54 55 func main() { 56 ip, err := externalIP() 57 if err != nil { 58 fmt.Println(err) 59 } 60 61 fmt.Println(ip.String()) 62 }