欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言中獲取IP地址的方法詳解

 更新時(shí)間:2023年11月21日 11:30:49   作者:shura1014  
這篇文章主要為大家詳細(xì)介紹了Go語言中獲取IP地址的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

簡介

在net包中提供了獲取所有網(wǎng)卡的ip,一般不會用127.0.0.1,::1這樣的本地回環(huán)地址,可以過濾掉,如果想要獲取當(dāng)前真正在使用的地址,得通過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 {
		// 過濾調(diào)本地回環(huán)地址
		if ip, ok := addr.(*net.IPNet); ok && !ip.IP.IsLoopback() {
			ips = append(ips, ip)
		}
	}
	return ips
}

獲取正在使用的地址

通過net.Dial去連一下自然就能知道自己用的是哪個(gè)地址,使用udp去連地址可以隨便寫,只要符合規(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í),不推薦)

簡單示例代碼如下:

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á),只需要對應(yīng)的 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
}

到此這篇關(guān)于Go語言中獲取IP地址的方法詳解的文章就介紹到這了,更多相關(guān)Go獲取IP地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang內(nèi)存對齊詳解

    golang內(nèi)存對齊詳解

    在golang中,每一種數(shù)據(jù)類型都有其對應(yīng)的數(shù)據(jù)類型大小,也就是占用了多少內(nèi)存空間,我們可以通過unsafe.Sizeof函數(shù),來確定一個(gè)變量占用的內(nèi)存字節(jié)數(shù),本文將詳細(xì)給大家介紹golang內(nèi)存對齊,需要的朋友可以參考下
    2023-10-10
  • golang開發(fā)go包依賴管理godep使用教程

    golang開發(fā)go包依賴管理godep使用教程

    這篇文章主要為大家介紹了golang開發(fā)go包依賴管理godep使用教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • golang flag介紹和使用示例

    golang flag介紹和使用示例

    本文主要介紹了Go語言中flag包的使用方法,詳細(xì)闡述了基本概念及常用函數(shù),并通過示例代碼進(jìn)行了具體演示,總結(jié)中指出,flag包提供了一種方便的方式來處理命令行參數(shù),可定義不同類型的標(biāo)志,并在解析后使用這些參數(shù)
    2024-10-10
  • Go語言利用Unmarshal解析json字符串的實(shí)現(xiàn)

    Go語言利用Unmarshal解析json字符串的實(shí)現(xiàn)

    本文主要介紹了Go語言利用Unmarshal解析json字符串的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Go下載安裝及切換不同版本的實(shí)現(xiàn)方法

    Go下載安裝及切換不同版本的實(shí)現(xiàn)方法

    本文詳細(xì)介紹了如何下載和安裝Go語言,以及如何切換不同版本的Go,通過提供詳細(xì)的步驟和解釋,幫助讀者理解Go語言的安裝和版本管理
    2024-12-12
  • Golang如何實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換的方法示例

    Golang如何實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換的方法示例

    進(jìn)制轉(zhuǎn)換是人們利用符號來計(jì)數(shù)的方法,進(jìn)制轉(zhuǎn)換由一組數(shù)碼符號和兩個(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í),下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • golang xorm日志寫入文件中的操作

    golang xorm日志寫入文件中的操作

    這篇文章主要介紹了golang xorm日志寫入文件中的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go Resiliency庫中timeout實(shí)現(xiàn)原理及源碼解析

    Go Resiliency庫中timeout實(shí)現(xiàn)原理及源碼解析

    Go-Resiliency庫中的timeout是一種基于協(xié)程的超時(shí)機(jī)制,通過創(chuàng)建協(xié)程來執(zhí)行任務(wù)并設(shè)置超時(shí)時(shí)間,若任務(wù)執(zhí)行時(shí)間超時(shí)則中止協(xié)程并返回錯(cuò)誤,需要詳細(xì)了解可以參考下文
    2023-05-05
  • GO實(shí)現(xiàn)基于命令行的簡單IPS程序代碼

    GO實(shí)現(xiàn)基于命令行的簡單IPS程序代碼

    本文介紹了入侵防御系統(tǒng)IPS的工作原理和實(shí)現(xiàn),IPS通過網(wǎng)絡(luò)流量監(jiān)控和實(shí)時(shí)響應(yīng),防止網(wǎng)絡(luò)攻擊,通過使用Go語言實(shí)現(xiàn)一個(gè)簡單的IPS示例程序,展示了如何獲取本地IP地址和探測網(wǎng)絡(luò)中其他設(shè)備的IP地址,包括如何定義和加載規(guī)則文件,以及如何檢測IP對相應(yīng)端口的訪問是否達(dá)到規(guī)定閾值
    2024-12-12
  • Go語言中struct的匿名屬性特征實(shí)例分析

    Go語言中struct的匿名屬性特征實(shí)例分析

    這篇文章主要介紹了Go語言中struct的匿名屬性特征,實(shí)例分析了struct的匿名屬性特征,對于深入學(xué)習(xí)Go語言程序設(shè)計(jì)具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評論