Go语言中获取IP地址的方法详解

 更新时间:2023年11月21日 11:30:49   作者:shura1014  
这篇文章主要为大家详细介绍了Go语言中获取IP地址的相关方法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起学习一下

简介

在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地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解Go语言中的Option设计模式

    一文详解Go语言中的Option设计模式

    这篇文章主要为大家详细介绍了Go语言中Option设计模式的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-05-05
  • Go语言基础函数基本用法及示例详解

    Go语言基础函数基本用法及示例详解

    这篇文章主要为大家介绍了Go语言基础函数基本用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • Golang 如何解析和生成json

    Golang 如何解析和生成json

    这篇文章主要介绍了Golang 如何解析和生成json,帮助大家更好的理解和学习golang,感兴趣的朋友可以了解下
    2020-09-09
  • Golang的strings.Split()踩坑记录

    Golang的strings.Split()踩坑记录

    工作中,当我们需要对字符串按照某个字符串切分成字符串数组数时,常用到strings.Split(),本文主要介绍了Golang的strings.Split()踩坑记录,感兴趣的可以了解一下
    2022-05-05
  • 使用Golang快速构建出命令行应用程序

    使用Golang快速构建出命令行应用程序

    在日常开发中,大家对命令行工具(CLI)想必特别熟悉了,如果说你不知道命令工具,那你可能是个假开发。每天都会使用大量的命令行工具,例如最常用的Git、Go、Docker等,这篇文章主要介绍了使用Golang快速构建出命令行应用程序,需要的朋友可以参考下
    2023-02-02
  • 浅析Go项目中的依赖包管理与Go Module常规操作

    浅析Go项目中的依赖包管理与Go Module常规操作

    这篇文章主要为大家详细介绍了Go项目中的依赖包管理与Go Module常规操作,文中的示例代码讲解详细,对我们深入了解Go语言有一定的帮助,需要的可以跟随小编一起学习一下
    2023-10-10
  • vscode插件设置之Golang开发环境配置全过程

    vscode插件设置之Golang开发环境配置全过程

    go语言开发选择vscode作为IDE工具也是一个不错的选择,下面这篇文章主要给大家介绍了关于vscode插件设置之Golang开发环境配置的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 使用Go语言发送邮件的示例代码

    使用Go语言发送邮件的示例代码

    很多朋友想试试用Go语言发送邮件,所以接下来小编给大家介绍一下如何用Go语言发送邮件,文中通过代码实例讲解的非常详细,需要的朋友可以参考下
    2023-07-07
  • Golang实现Md5校验的代码示例

    Golang实现Md5校验的代码示例

    最近项目中有个需求,就是地图文件下发后,接收方需要文件的md5值,和接收到的文件做比对,以免文件不完整,引起bug,于是测试了下本地文件和远程文件的md5计算,所以本文给大家介绍了Golang实现Md5校验,需要的朋友可以参考下
    2024-07-07
  • Go语言实现遗传算法的实例代码

    Go语言实现遗传算法的实例代码

    Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文将重点介绍如何用Go语言实现遗传算法。如果你还没有参加过GoLang Tour,我还建议你快速看一下这门语言的介绍
    2017-11-11

最新评论