Go语言中获取IP地址的方法小结

 更新时间:2023年12月06日 14:25:01   作者:落雷  
这篇文章主要为大家详细介绍了Go语言中获取IP地址的常用方法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起学习一下

1. 获取本地IP地址

使用 net 包可以获取本地机器的 IP 地址。以下是一个获取本地 IP 地址的简单示例:

package main
 
import (
	"fmt"
	"net"
)
 
func main() {
	// 获取所有网络接口
	interfaces, err := net.Interfaces()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
 
	// 遍历所有网络接口
	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 结构体来获取客户端的 IP 地址。具体来说,Request 结构体中的 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 服务器,监听在 8080 端口
	http.ListenAndServe(":8080", nil)
}

在这个例子中,r.RemoteAddr 包含了客户端的 IP 地址和端口号,使用 net.SplitHostPort 函数可以方便地从这个字符串中提取出 IP 地址。请注意,由于这个方法使用 TCP 连接的信息,所以对于某些代理服务器或负载均衡器,它可能只是代理服务器的 IP 地址,而不是实际客户端的 IP 地址。在这种情况下,可能需要查看 HTTP 头部中的相关字段以获取真实的客户端 IP 地址。

3. 使用 gin 获取客户端 IP

在 Gin 框架中,可以通过 c.ClientIP() 方法获取客户端的 IP 地址。这个方法会尝试从不同的来源获取 IP 地址,包括 X-Forwarded-For 头部、X-Real-IP 头部以及连接的远程地址。

// 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 服务器,监听在 8080 端口
	r.Run(":8080")
}

在这个例子中,c.ClientIP() 会自动处理不同的头部并返回客户端的 IP 地址。如果的应用程序部署在代理服务器或负载均衡器之后,确保这些设备正确地设置了 X-Forwarded-For 或 X-Real-IP 头部,以便正确获取客户端的 IP 地址。

到此这篇关于Go语言中获取IP地址的方法小结的文章就介绍到这了,更多相关Go获取IP地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言sync.Pool对象池使用场景基本示例

    Go语言sync.Pool对象池使用场景基本示例

    这篇文章主要为大家介绍了Go语言sync.Pool对象池使用场景的基本示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  •  Go 语言实现 HTTP 文件上传和下载

     Go 语言实现 HTTP 文件上传和下载

    这篇文章主要介绍了Go语言实现HTTP文件上传和下载,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Go语言中init函数特点、用途和注意事项详解

    Go语言中init函数特点、用途和注意事项详解

    go语言中有一个非常神奇的函数init,它可以在所有程序执行开始前被执行,并且每个package下面可以存在多个init函数,这篇文章主要给大家介绍了关于Go语言中init函数特点、用途和注意事项的相关资料,需要的朋友可以参考下
    2023-07-07
  • golang强制类型转换和类型断言

    golang强制类型转换和类型断言

    这篇文章主要介绍了详情介绍golang类型转换问题,分别由介绍类型断言和类型转换,这两者都是不同的概念,下面文章围绕类型断言和类型转换的相关资料展开文章的详细内容,需要的朋友可以参考以下
    2021-12-12
  • Go和Java算法详析之分数到小数

    Go和Java算法详析之分数到小数

    这篇文章主要给大家介绍了关于Go和Java算法详析之分数到小数的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-08-08
  • Go操作mongodb数据库方法示例

    Go操作mongodb数据库方法示例

    这篇文章主要为大家介绍了Go操作mongodb数据库方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Golang语言的多种变量声明方式与使用场景详解

    Golang语言的多种变量声明方式与使用场景详解

    Golang当中的变量类型和C/C++比较接近,一般用的比较多的也就是int,float和字符串,下面这篇文章主要给大家介绍了关于Golang语言的多种变量声明方式与使用场景的相关资料,需要的朋友可以参考下
    2022-02-02
  • golang实现ftp实时传输文件的案例

    golang实现ftp实时传输文件的案例

    这篇文章主要介绍了golang实现ftp实时传输文件的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang中map的三种声明定义方式实现

    Golang中map的三种声明定义方式实现

    本文主要介绍了Golang中map的三种声明定义方式实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • go实现一个分布式限流器的方法步骤

    go实现一个分布式限流器的方法步骤

    项目中需要对api的接口进行限流,本文主要介绍了go实现一个分布式限流器的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论