golang根据网卡获取第一个没有回路的本机ip地址

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 获取主机index最小的IP
func GetLocalIP() (ip string) {
	ints, err := net.Interfaces()
	if err != nil {
		return "127.0.0.1"
	}
	lowest := math.MaxInt64
	for i := range ints {
		if (ints[i].Flags & net.FlagUp) != 0 {
			if ints[i].Index < lowest {
				lowest = ints[i].Index
				address, err := ints[i].Addrs()
				if err == nil {
					for j := range address {
						if ipnet, ok := address[j].(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
							if ipnet.IP.To4() != nil {
								ip = ipnet.IP.String()
							}
						}
					}
				}
			}
		}
	}
	return
}

获取相对比较靠谱的mac地址

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

// 获取mac地址
func getMacAddr() string {
	nets, err := net.Interfaces()
	if err != nil {
		log.Fatal().Err(err).Msg("无法生成激活码,获取网卡失败")
		return ""
	}
	var macInterface net.Interface
	for _, stat := range nets {
		// 跳过回环网卡
		if strings.Contains(stat.Flags.String(), "loopback") {
			continue
		}
		// 跳过没有启动的网卡
		if !strings.HasPrefix(stat.Flags.String(), "up") {
			continue
		}
		// 跳过虚拟网卡
		if strings.Contains(stat.Name, "VMware") || strings.Contains(stat.Name, "docker") ||
			strings.Contains(stat.Name, "veth") || strings.Contains(stat.Name, "virbr") ||
			strings.Contains(stat.Name, "vEthernet") || strings.HasPrefix(stat.Name, "v") {
			continue
		}
		// 如果已经取到第一个网卡,则不再获取网卡了。
		if macInterface.Name != "" {
			break
		}

		// 优先获取网卡
		if isLinux() && stat.Name == "eth0" {
			macInterface = stat
			break
		}

		if isWindows() && (stat.Name == "以太网" || stat.Name == "WLAN" || strings.HasPrefix(stat.Name, "本地连接")) {
			macInterface = stat
			break
		}

		macInterface = stat
	}
	if macInterface.Name == "" {
		return ""
	}
	return macInterface.HardwareAddr.String()
}

// darwin, freebsd, linux
func isWindows() bool {
	return runtime.GOOS == "windows"
}

func isLinux() bool {
	return runtime.GOOS == "linux"
}