Go語(yǔ)言中獲取IP地址的方法詳解
簡(jiǎn)介
在net包中提供了獲取所有網(wǎng)卡的ip,一般不會(huì)用127.0.0.1,::1這樣的本地回環(huán)地址,可以過(guò)濾掉,如果想要獲取當(dāng)前真正在使用的地址,得通過(guò)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 { // 過(guò)濾調(diào)本地回環(huán)地址 if ip, ok := addr.(*net.IPNet); ok && !ip.IP.IsLoopback() { ips = append(ips, ip) } } return ips }
獲取正在使用的地址
通過(guò)net.Dial去連一下自然就能知道自己用的是哪個(gè)地址,使用udp去連地址可以隨便寫(xiě),只要符合規(guī)范
func main() { fmt.Println(GetUseIp()) } func GetUseIp() string { dial, err := net.Dial("udp", "8.8.8.8:80") // Google的公共DNS服務(wù)器 if err != nil { return "127.0.0.1" } addr := dial.LocalAddr().String() index := strings.LastIndex(addr, ":") return addr[:index] }
執(zhí)行輸出
172.20.131.124
方法補(bǔ)充
1、借助 net.InterfaceAddrs 方法(多網(wǎng)卡時(shí),不推薦)
簡(jiǎn)單示例代碼如下:
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 不需要關(guān)注是否送達(dá),只需要對(duì)應(yīng)的 ip 和 port 正確,即可獲取到 IP 地址。簡(jiǎn)單示例代碼如下:
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 }
到此這篇關(guān)于Go語(yǔ)言中獲取IP地址的方法詳解的文章就介紹到這了,更多相關(guān)Go獲取IP地址內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang開(kāi)發(fā)go包依賴(lài)管理godep使用教程
這篇文章主要為大家介紹了golang開(kāi)發(fā)go包依賴(lài)管理godep使用教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11Go語(yǔ)言利用Unmarshal解析json字符串的實(shí)現(xiàn)
本文主要介紹了Go語(yǔ)言利用Unmarshal解析json字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05Golang如何實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換的方法示例
進(jìn)制轉(zhuǎn)換是人們利用符號(hào)來(lái)計(jì)數(shù)的方法,進(jìn)制轉(zhuǎn)換由一組數(shù)碼符號(hào)和兩個(gè)基本因素“基數(shù)”與“位權(quán)”構(gòu)成,這篇文章主要給大家介紹了關(guān)于Golang如何實(shí)現(xiàn)10進(jìn)制轉(zhuǎn)換62進(jìn)制的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí)學(xué)習(xí),下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09Go Resiliency庫(kù)中timeout實(shí)現(xiàn)原理及源碼解析
Go-Resiliency庫(kù)中的timeout是一種基于協(xié)程的超時(shí)機(jī)制,通過(guò)創(chuàng)建協(xié)程來(lái)執(zhí)行任務(wù)并設(shè)置超時(shí)時(shí)間,若任務(wù)執(zhí)行時(shí)間超時(shí)則中止協(xié)程并返回錯(cuò)誤,需要詳細(xì)了解可以參考下文2023-05-05GO實(shí)現(xiàn)基于命令行的簡(jiǎn)單IPS程序代碼
本文介紹了入侵防御系統(tǒng)IPS的工作原理和實(shí)現(xiàn),IPS通過(guò)網(wǎng)絡(luò)流量監(jiān)控和實(shí)時(shí)響應(yīng),防止網(wǎng)絡(luò)攻擊,通過(guò)使用Go語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的IPS示例程序,展示了如何獲取本地IP地址和探測(cè)網(wǎng)絡(luò)中其他設(shè)備的IP地址,包括如何定義和加載規(guī)則文件,以及如何檢測(cè)IP對(duì)相應(yīng)端口的訪問(wèn)是否達(dá)到規(guī)定閾值2024-12-12Go語(yǔ)言中struct的匿名屬性特征實(shí)例分析
這篇文章主要介紹了Go語(yǔ)言中struct的匿名屬性特征,實(shí)例分析了struct的匿名屬性特征,對(duì)于深入學(xué)習(xí)Go語(yǔ)言程序設(shè)計(jì)具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02