取本机内网 IP,遍历所有网卡地址,跳过回环,拿第一个 IPv4:
func GetLocalIP() string {
ip := "127.0.0.1"
addrs, err := net.InterfaceAddrs()
if err != nil {
return ip
}
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
ip = ipnet.IP.String()
break
}
}
}
return ip
}
两个地方值得留意:
break在拿到第一个非回环 IPv4 时就退出,所以多网卡机器上拿到哪个地址,取决于InterfaceAddrs()的遍历顺序,不一定是你要的那块网卡。需要指定网卡时,改用net.InterfaceByName再取它自己的地址。- 默认值
127.0.0.1在取不到结果时返回,比如机器只有 IPv6、或InterfaceAddrs()报错。调用方最好把这种情况当成「没拿到」处理,而不是真的去连 127.0.0.1。
评论
还没有人留言。