简介
在net包中提供了获取所有网卡的ip,一般不会用127.0.0.1,::1这样的本地回环地址,可以过滤掉,如果想要获取当前真正在使用的地址,得通过net.Dail去连一下才知道
获取ip地址
func main() { fmt.Println(getIpv4()) fmt.Println(getIpv6()) } func getIpv4() []string { ips := make([]string, 0) for _, ip := range GetAllIp() { if ip.IP.To4() != nil { ips = append(ips, ip.IP.String()) } } return ips } func getIpv6() []string { ips := make([]string, 0) for _, ip := range GetAllIp() { if ip.IP.To16() != nil { ips = append(ips, ip.IP.String()) } } return ips } func GetAllIp() []*net.IPNet { ips := make([]*net.IPNet, 0) addrs, _ := net.InterfaceAddrs() for _, addr := range addrs { // 过滤调本地回环地址 if ip, ok := addr.(*net.IPNet); ok && !ip.IP.IsLoopback() { ips = append(ips, ip) } } return ips }
获取正在使用的地址
通过net.Dial去连一下自然就能知道自己用的是哪个地址,使用udp去连地址可以随便写,只要符合规范
func main() { fmt.Println(GetUseIp()) } func GetUseIp() string { dial, err := net.Dial("udp", "8.8.8.8:80") // Google的公共DNS服务器 if err != nil { return "127.0.0.1" } addr := dial.LocalAddr().String() index := strings.LastIndex(addr, ":") return addr[:index] }
执行输出
172.20.131.124
方法补充
1、借助 net.InterfaceAddrs 方法(多网卡时,不推荐)
简单示例代码如下:
package main import ( "fmt" "net" ) func main() { ip := getHostIp() fmt.Println(ip) } func getHostIp() string { addrList, err := net.InterfaceAddrs() if err != nil { fmt.Println("get current host ip err: ", err) return "" } var ip string for _, address := range addrList { if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { if ipNet.IP.To4() != nil { ip = ipNet.IP.String() break } } } return ip }
2、借助 net.Dial 方法(推荐)
使用 udp 不需要关注是否送达,只需要对应的 ip 和 port 正确,即可获取到 IP 地址。简单示例代码如下:
package main import ( "fmt" "net" "strings" ) func main() { ip := getHostIp() fmt.Println(ip) } func getHostIp() string { conn, err := net.Dial("udp", "8.8.8.8:53") if err != nil { fmt.Println("get current host ip err: ", err) return "" } addr := conn.LocalAddr().(*net.UDPAddr) ip := strings.Split(addr.String(), ":")[0] return ip }
到此这篇关于Go语言中获取IP地址的方法详解的文章就介绍到这了,更多相关Go获取IP地址内容请搜索好代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好代码网!