Go語言中獲取IP地址的方法小結(jié)
1. 獲取本地IP地址
使用 net 包可以獲取本地機(jī)器的 IP 地址。以下是一個(gè)獲取本地 IP 地址的簡(jiǎn)單示例:
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 地址和端口號(hào)。
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
...
}以下是一個(gè)簡(jiǎn)單的示例:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 通過 RemoteAddr 獲取客戶端的 IP 地址和端口號(hào)
ip, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil {
fmt.Println("Error extracting IP:", err)
return
}
fmt.Fprintf(w, "Client IP: %s", ip)
})
// 啟動(dòng) HTTP 服務(wù)器,監(jiān)聽在 8080 端口
http.ListenAndServe(":8080", nil)
}在這個(gè)例子中,r.RemoteAddr 包含了客戶端的 IP 地址和端口號(hào),使用 net.SplitHostPort 函數(shù)可以方便地從這個(gè)字符串中提取出 IP 地址。請(qǐng)注意,由于這個(gè)方法使用 TCP 連接的信息,所以對(duì)于某些代理服務(wù)器或負(fù)載均衡器,它可能只是代理服務(wù)器的 IP 地址,而不是實(shí)際客戶端的 IP 地址。在這種情況下,可能需要查看 HTTP 頭部中的相關(guān)字段以獲取真實(shí)的客戶端 IP 地址。
3. 使用 gin 獲取客戶端 IP
在 Gin 框架中,可以通過 c.ClientIP() 方法獲取客戶端的 IP 地址。這個(gè)方法會(huì)嘗試從不同的來源獲取 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
以下是一個(gè)簡(jiǎn)單的示例:
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)
})
// 啟動(dòng) Gin 服務(wù)器,監(jiān)聽在 8080 端口
r.Run(":8080")
}在這個(gè)例子中,c.ClientIP() 會(huì)自動(dòng)處理不同的頭部并返回客戶端的 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang設(shè)計(jì)模式之責(zé)任鏈模式講解和代碼示例
責(zé)任鏈?zhǔn)且环N行為設(shè)計(jì)模式, 允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送, 直至其中一個(gè)處理者對(duì)其進(jìn)行處理,本文就詳細(xì)給大家介紹一下Golang 責(zé)任鏈模式,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-06-06
Golang?統(tǒng)計(jì)字符串中數(shù)字字母數(shù)量的實(shí)現(xiàn)方法
這篇文章主要介紹了Golang?統(tǒng)計(jì)字符串中數(shù)字字母數(shù)量,本文給出了兩種從字符串獲取數(shù)字與字母數(shù)量的方法,分別是ASCII 碼值和正則表達(dá)式,需要的朋友可以參考下2022-06-06
Go語言學(xué)習(xí)之操作MYSQL實(shí)現(xiàn)CRUD
Go官方提供了database包,database包下有sql/driver。該包用來定義操作數(shù)據(jù)庫(kù)的接口,這保證了無論使用哪種數(shù)據(jù)庫(kù),操作方式都是相同的。本文就來和大家聊聊Go語言如何操作MYSQL實(shí)現(xiàn)CRUD,希望對(duì)大家有所幫助2023-02-02
go語言數(shù)據(jù)結(jié)構(gòu)之前綴樹Trie
這篇文章主要介紹了go語言數(shù)據(jù)結(jié)構(gòu)之前綴樹Trie,文章圍繞主題展開詳細(xì)內(nèi)容介紹,具有一定得參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
Go中g(shù)routine通信與context控制實(shí)例詳解
隨著context包的引入,標(biāo)準(zhǔn)庫(kù)中很多接口因此加上了context參數(shù),下面這篇文章主要給大家介紹了關(guān)于Go中g(shù)routine通信與context控制的相關(guān)資料,需要的朋友可以參考下2022-02-02
golang?日志庫(kù)ZAP[uber-go?zap]示例詳解
ZAP是由Uber開源的高性能Go語言日志庫(kù),支持多種日志級(jí)別及基本信息打印,雖然ZAP本身不支持日志分割,但可以結(jié)合lumberjack進(jìn)行日志切割,實(shí)現(xiàn)日志按文件大小、時(shí)間或間隔切割等功能,ZAP提供Logger和SugaredLogger兩種日志記錄器2024-10-10
Golang線上內(nèi)存爆掉問題排查(pprof)與解決
這篇文章主要介紹了Golang線上內(nèi)存爆掉問題排查(pprof)與解決,涉及到數(shù)據(jù)敏感,文中代碼是我模擬線上故障的一個(gè)情況,好在我們程序都有添加pprof監(jiān)控,于是直接通過go tool pprof分析,需要的朋友可以參考下2024-04-04
Golang調(diào)用FFmpeg轉(zhuǎn)換視頻流的實(shí)現(xiàn)
本文主要介紹了Golang調(diào)用FFmpeg轉(zhuǎn)換視頻流,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

