Go語言中獲取IP地址的方法詳解
簡介
在net包中提供了獲取所有網卡的ip,一般不會用127.0.0.1,::1這樣的本地回環(huán)地址,可以過濾掉,如果想要獲取當前真正在使用的地址,得通過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 {
// 過濾調本地回環(huán)地址
if ip, ok := addr.(*net.IPNet); ok && !ip.IP.IsLoopback() {
ips = append(ips, ip)
}
}
return ips
}
獲取正在使用的地址
通過net.Dial去連一下自然就能知道自己用的是哪個地址,使用udp去連地址可以隨便寫,只要符合規(guī)范
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]
}
執(zhí)行輸出
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地址內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺析Go項目中的依賴包管理與Go?Module常規(guī)操作
這篇文章主要為大家詳細介紹了Go項目中的依賴包管理與Go?Module常規(guī)操作,文中的示例代碼講解詳細,對我們深入了解Go語言有一定的幫助,需要的可以跟隨小編一起學習一下2023-10-10
vscode插件設置之Golang開發(fā)環(huán)境配置全過程
go語言開發(fā)選擇vscode作為IDE工具也是一個不錯的選擇,下面這篇文章主要給大家介紹了關于vscode插件設置之Golang開發(fā)環(huán)境配置的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-12-12

