Go語言中獲取IP地址的方法小結(jié)
1. 獲取本地IP地址
使用 net
包可以獲取本地機器的 IP 地址。以下是一個獲取本地 IP 地址的簡單示例:
package main import ( "fmt" "net" ) func main() { // 獲取所有網(wǎng)絡(luò)接口 interfaces, err := net.Interfaces() if err != nil { fmt.Println("Error:", err) return } // 遍歷所有網(wǎng)絡(luò)接口 for _, iface := range interfaces { // 排除一些特殊接口 if iface.Flags&net.FlagUp == 0 || iface.Flags&net.FlagLoopback != 0 { continue } // 獲取接口的地址信息 addrs, err := iface.Addrs() if err != nil { fmt.Println("Error:", err) continue } // 遍歷接口的地址 for _, addr := range addrs { // 檢查地址類型 switch v := addr.(type) { case *net.IPNet: // IPv4 或 IPv6 地址 fmt.Println(v.IP) case *net.IPAddr: // 一般情況下是 IPv4 地址 fmt.Println(v.IP) } } } }
2. 使用 net/http 獲取客戶端 IP
在 Go 中,可以使用 net/http
包中的 Request
結(jié)構(gòu)體來獲取客戶端的 IP 地址。具體來說,Request
結(jié)構(gòu)體中的 RemoteAddr
字段包含了客戶端的 IP 地址和端口號。
type Request struct { ... // RemoteAddr allows HTTP servers and other software to record // the network address that sent the request, usually for // logging. This field is not filled in by ReadRequest and // has no defined format. The HTTP server in this package // sets RemoteAddr to an "IP:port" address before invoking a // handler. // This field is ignored by the HTTP client. RemoteAddr string ... }
以下是一個簡單的示例:
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 通過 RemoteAddr 獲取客戶端的 IP 地址和端口號 ip, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { fmt.Println("Error extracting IP:", err) return } fmt.Fprintf(w, "Client IP: %s", ip) }) // 啟動 HTTP 服務(wù)器,監(jiān)聽在 8080 端口 http.ListenAndServe(":8080", nil) }
在這個例子中,r.RemoteAddr
包含了客戶端的 IP 地址和端口號,使用 net.SplitHostPort
函數(shù)可以方便地從這個字符串中提取出 IP 地址。請注意,由于這個方法使用 TCP 連接的信息,所以對于某些代理服務(wù)器或負(fù)載均衡器,它可能只是代理服務(wù)器的 IP 地址,而不是實際客戶端的 IP 地址。在這種情況下,可能需要查看 HTTP 頭部中的相關(guān)字段以獲取真實的客戶端 IP 地址。
3. 使用 gin 獲取客戶端 IP
在 Gin 框架中,可以通過 c.ClientIP()
方法獲取客戶端的 IP 地址。這個方法會嘗試從不同的來源獲取 IP 地址,包括 X-Forwarded-For 頭部、X-Real-IP 頭部以及連接的遠(yuǎn)程地址。
// ClientIP implements one best effort algorithm to return the real client IP. // It calls c.RemoteIP() under the hood, to check if the remote IP is a trusted proxy or not. // If it is it will then try to parse the headers defined in Engine.RemoteIPHeaders (defaulting to [X-Forwarded-For, X-Real-Ip]). // If the headers are not syntactically valid OR the remote IP does not correspond to a trusted proxy, the remote IP (coming from Request.RemoteAddr) is returned. func (c *Context) ClientIP() string
以下是一個簡單的示例:
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { // 獲取客戶端的 IP 地址 clientIP := c.ClientIP() c.String(http.StatusOK, "Client IP: %s", clientIP) }) // 啟動 Gin 服務(wù)器,監(jiān)聽在 8080 端口 r.Run(":8080") }
在這個例子中,c.ClientIP()
會自動處理不同的頭部并返回客戶端的 IP 地址。如果的應(yīng)用程序部署在代理服務(wù)器或負(fù)載均衡器之后,確保這些設(shè)備正確地設(shè)置了 X-Forwarded-For 或 X-Real-IP 頭部,以便正確獲取客戶端的 IP 地址。
到此這篇關(guān)于Go語言中獲取IP地址的方法小結(jié)的文章就介紹到這了,更多相關(guān)Go獲取IP地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang設(shè)計模式之責(zé)任鏈模式講解和代碼示例
責(zé)任鏈?zhǔn)且环N行為設(shè)計模式, 允許你將請求沿著處理者鏈進行發(fā)送, 直至其中一個處理者對其進行處理,本文就詳細(xì)給大家介紹一下Golang 責(zé)任鏈模式,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-06-06Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量的實現(xiàn)方法
這篇文章主要介紹了Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量,本文給出了兩種從字符串獲取數(shù)字與字母數(shù)量的方法,分別是ASCII 碼值和正則表達式,需要的朋友可以參考下2022-06-06Go語言學(xué)習(xí)之操作MYSQL實現(xiàn)CRUD
Go官方提供了database包,database包下有sql/driver。該包用來定義操作數(shù)據(jù)庫的接口,這保證了無論使用哪種數(shù)據(jù)庫,操作方式都是相同的。本文就來和大家聊聊Go語言如何操作MYSQL實現(xiàn)CRUD,希望對大家有所幫助2023-02-02go語言數(shù)據(jù)結(jié)構(gòu)之前綴樹Trie
這篇文章主要介紹了go語言數(shù)據(jù)結(jié)構(gòu)之前綴樹Trie,文章圍繞主題展開詳細(xì)內(nèi)容介紹,具有一定得參考價值,需要的小伙伴可以參考一下2022-05-05Go中g(shù)routine通信與context控制實例詳解
隨著context包的引入,標(biāo)準(zhǔn)庫中很多接口因此加上了context參數(shù),下面這篇文章主要給大家介紹了關(guān)于Go中g(shù)routine通信與context控制的相關(guān)資料,需要的朋友可以參考下2022-02-02golang?日志庫ZAP[uber-go?zap]示例詳解
ZAP是由Uber開源的高性能Go語言日志庫,支持多種日志級別及基本信息打印,雖然ZAP本身不支持日志分割,但可以結(jié)合lumberjack進行日志切割,實現(xiàn)日志按文件大小、時間或間隔切割等功能,ZAP提供Logger和SugaredLogger兩種日志記錄器2024-10-10Golang線上內(nèi)存爆掉問題排查(pprof)與解決
這篇文章主要介紹了Golang線上內(nèi)存爆掉問題排查(pprof)與解決,涉及到數(shù)據(jù)敏感,文中代碼是我模擬線上故障的一個情況,好在我們程序都有添加pprof監(jiān)控,于是直接通過go tool pprof分析,需要的朋友可以參考下2024-04-04Golang調(diào)用FFmpeg轉(zhuǎn)換視頻流的實現(xiàn)
本文主要介紹了Golang調(diào)用FFmpeg轉(zhuǎn)換視頻流,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02