golang 获取本机真实IP
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 }