先定义一个函数来判断IP地址是否为内网,归为工具类

// utils/ip/enter.go
package ipimport "net"func HasLocalIPAddr(ip string) bool {return HasLocalIP(net.ParseIP(ip))
}// HasLocalIP 检测 IP 地址是否是内网地址
// 通过直接对比ip段范围效率更高
func HasLocalIP(ip net.IP) bool {if ip.IsLoopback() {return true}
// 	• ip.IsLoopback() 内置判断 IP 是否属于 127.0.0.0/8(IPv4 回环)或 ::1(IPv6)。
// • 回环属于“本机”地址,也算内网,所以直接 true。ip4 := ip.To4()// 若 IP 是 IPv4,返回 4 字节切片if ip4 == nil {return false// 如果不是 IPv4,就当作“不是内网 IPv4”直接 false}return ip4[0] == 10 || // 10.0.0.0/8(ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31) || // 172.16.0.0/12(ip4[0] == 169 && ip4[1] == 254) || // 169.254.0.0/16(ip4[0] == 192 && ip4[1] == 168) // 192.168.0.0/16
}

HasLocalIP——核心判断函数

• 入参:ip net.IP(字节切片),已经是结构化类型;
• 返回 bool:是内网返回 true,否则 false。

检测本地回环地址

• ip.IsLoopback() 内置判断 IP 是否属于 127.0.0.0/8(IPv4 回环)或 ::1(IPv6)。
• 回环属于“本机”地址,也算内网,所以直接 true。
Apply

取 IPv4 形式

• ip.To4() 若 IP 是 IPv4,返回 4 字节切片;如果是 IPv6 或格式无效,则返回 nil。
• 如果不是 IPv4,就当作“不是内网 IPv4”直接 false(简化处理;也可以扩展 IPv6 私网段)。

判断第一类私网:10.0.0.0/8

• 私网段 A 类;只需检查 首字节=10。

判断第二类私网:172.16.0.0/12

• 首字节=172 且第二字节 16~31 范围内。

判断第三类:169.254.0.0/16

• 这是 链接本地地址(Link-local),自动分配的内网段。
Apply

判断第四类:192.168.0.0/16

• 家用路由器最常见的私网段:首字节 192,第二字节 168。
• 整个 return 语句用逻辑 OR || 把四种条件连起来——任何一类匹配即返回 true。

HasLocalIPAddr——对外友好函数

• 入参:ip string(字符串形式的 IP,如 “192.168.1.5”)。
• net.ParseIP(ip) 把字符串转换为 net.IP 类型;如果格式不对会返回 nil。
• 然后直接调用下方的 HasLocalIP 做真正判断。
• 好处:对外提供 字符串版本 API,内部使用更强大的 net.IP API。
🌟 文件作用总结
utils/ip/enter.go 提供两层接口,专门判断“某个 IP 地址是否属于内网”:
HasLocalIPAddr(ip string) bool
输入 IP 字符串,内部转成 net.IP,再复用核心逻辑。
方便外部调用。
HasLocalIP(ip net.IP) bool
更底层,直接接受 net.IP。
通过四类私网段 + 回环地址判断是否是本地/私有 IP。
采用位段对比,效率比逐条 CIDR 解析更高。
在其他模块里,你就可以:

if ipUtils.HasLocalIPAddr("192.168.1.7") {fmt.Println("这是内网地址")
}

init_ip_db.go

执行查询并返回查询结果

// core/init_ip_db.go
package coreimport (ipUtils "blogx_server/utils/ip""fmt""github.com/lionsoul2014/ip2region/binding/golang/xdb""github.com/sirupsen/logrus""strings"
)
//xdb.Searcher 来自第三方库 github.com/lionsoul2014/ip2region/binding/golang/xdb,
//是官方提供的“查询器”结构体。
var searcher *xdb.Searcher
//之后要用searcher来“搜索”IP 所属地区
//在 core 包里声明了一个全局指针变量 searcher,类型是 ip2region 库的 Searcher。
//它初始为 nil,在程序启动时由 InitIPDB() 加载真实 IP 数据库后赋值,用来让其他函数高效、统一地进行 IP 地理位置查询。func InitIPDB() {var dbPath = "init/ip2region.xdb"_searcher, err := xdb.NewWithFileOnly(dbPath)//只传文件路径 就创建 Searcher,它会把整个 xdb 文件一次性 mmap/加载到内存 → 查询速度快if err != nil {logrus.Fatalf("ip地址数据库加载失败 %s", err)return}searcher = _searcher//这里真正赋值
}
// InitIPDB()
// 在程序启动时调用一次;
// 从本地 init/ip2region.xdb 文件加载 ip2region 数据库;
// 获得 *xdb.Searcher 并存进包级变量 searcher,供全局复用。func GetIpAddr(ip string) (addr string) {if ipUtils.HasLocalIPAddr(ip) {return "内网"}region, err := searcher.SearchByStr(ip)// 正式查询if err != nil {logrus.Warnf("错误的ip地址 %s", err)return "异常地址"}_addrList := strings.Split(region, "|")if len(_addrList) != 5 {// 会有这个情况吗?logrus.Warnf("异常的ip地址 %s", ip)return "未知地址"}// _addrList 五个部分// 国家  0  省份   市   运营商country := _addrList[0]province := _addrList[2]city := _addrList[3]if province != "0" && city != "0" {return fmt.Sprintf("%s·%s", province, city)}if country != "0" && province != "0" {return fmt.Sprintf("%s·%s", country, province)}if country != "0" {return country}return region
}
// GetIpAddr(ip string) string
// 业务调用接口;
// 内网 IP → "内网";
// 公网 IP → 查询地理信息→按“省·市 / 国·省 / 国”优雅返回;
// 异常或未知→返回 "异常地址" / "未知地址"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86783.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86783.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86783.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙系统(HarmonyOS)应用开发之实现瀑布流图片展示效果

项目概述 科技图库是一款基于鸿蒙系统&#xff08;HarmonyOS&#xff09;开发的高品质图片浏览应用&#xff0c;专注于展示精选科技主题图片。应用采用现代化的瀑布流布局&#xff0c;为用户提供流畅、直观的浏览体验&#xff0c;让科技之美尽收眼底。 主要功能 1. 瀑布流布…

【fish-speech】新模型openaudio-s1-mini尝鲜

一、配置 显卡&#xff1a;v100&#xff08;测试简短语句&#xff0c;显存实际占用不足6G&#xff09; 二、安装测试 1. 安装 1.1 下载源码 git clone https://github.com/fishaudio/fish-speech.git1.2 安装系统组件 apt install portaudio19-dev libsox-dev ffmpeg1.3 …

介绍Windows下的由Sysinternals开发的一些小工具

Sysinternals是一个开发了很多Windows下系统工具的公司&#xff0c;这些工具能极大地提高对Windows系统的深入认知。就像它的名字Sys(tem)internals&#xff0c;深入系统里面。这些工具都放在微软的网站上可以下载到。https://learn.microsoft.com/en-us/sysinternals/ 下载网…

云服务器环境下Linux系统epoll机制与高并发服务器优化实践

在当今云计算时代&#xff0c;云已成为企业部署高并发服务的首选平台。本文将深入探讨Linux系统核心的epoll机制如何赋能云环境下的高并发服务器&#xff0c;解析其底层工作原理与性能优势&#xff0c;并对比传统IO复用模型的差异&#xff0c;帮助开发者构建更高效的云端服务架…

Java爬虫实战指南:按关键字搜索京东商品

在电商领域&#xff0c;快速获取商品信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。京东作为国内领先的电商平台之一&#xff0c;提供了丰富的商品数据。虽然京东开放平台提供了官方API来获取商品信息&#xff0c;但有时使用爬虫技术来抓取数据也是一种有…

aspose.word在IIS后端DLL中高并发运行,线程安全隔离

aspose.word在IIS后端DLL中运行,加载很慢,如何为全部用户加载,再每个用户访问时在各自线程中直接可以打开WORD文件处理 Aspose.Words 在 IIS 中优化加载性能方案 针对 Aspose.Words 在 IIS 后端 DLL 中加载缓慢的问题&#xff0c;我们可以通过单例模式预加载组件并结合线程安…

链表题解——回文链表【LeetCode】

一、算法逻辑&#xff08;通顺讲解每一步思路&#xff09; 我们从 isPalindrome 这个主函数入手&#xff1a; 步骤 1&#xff1a;找到链表的中间节点 middleNode 使用 快慢指针法&#xff08;slow 和 fast&#xff09; 快指针一次走两步&#xff0c;慢指针一次走一步。 当快…

allegro 铜皮的直角边怎么快速变成多边形?

像这种&#xff1a; 变成这种&#xff1a; 解决方案&#xff1a; shape edit boundary 点击铺铜边缘就能裁剪

从厨房到代码台:用做菜思维理解iOS开发 - Swift入门篇②

从厨房到代码台&#xff1a;用做菜思维理解iOS开发 - Swift入门篇② 本章重点​ 理解App开发的整体流程熟悉Xcode主界面结构与常用分区跟着步骤动手创建第一个App项目&#xff0c;认识模拟器掌握"打扫厨房"高频快捷键&#xff0c;解决常见疑难杂症 1、目标 像一个专…

EloqCloud for KV 初体验:兼容redis的云原生KV数据库

最近在做一些AI应用的时候&#xff0c;我在想尝试利用redis的能力缓存一些信息&#xff0c;这使我想去找一个免费的redis来进行使用&#xff0c;在调研的过程中我发现了一款产品EloqCloud for KV可以提供类似的能力&#xff0c;于是尝试使用了一下&#xff0c;本文记录了这次体…

企业级路由器技术全解析:从基础原理到实战开发

简介 在当今数字化时代,路由器作为网络的核心设备,其技术深度与应用广度直接影响着企业网络的性能与安全性。本文将全面解析路由器的基础原理、工作机制以及企业级开发技术,从网络层寻址到路由协议算法,从安全配置到QoS实现,再到多厂商API开发实战,旨在帮助网络工程师和…

day041-web集群架构搭建

文章目录 0. 老男孩思想-高薪四板斧1. web集群架构图2. 搭建异地备份服务2.1 服务端-阿里云服务器2.1.1 查看rsync软件包2.1.2 添加rsync配置文件2.1.3 添加虚拟用户2.1.4 创建校验用户密码文件2.1.5 创建备份目录2.1.6 启动服务2.1.7 开放安全组端口2.1.8 发送检查邮件 2.2 客…

day44-Django RestFramework(drf)下

1.5 Django RestFramework(下) drf 内置了很多便捷的功能,在接下来的课程中会给大家依次讲解下面的内容: 快速上手请求的封装版本管理认证权限限流序列化视图条件搜索分页路由解析器10. 分页 在查看数据列表的API中,如果 数据量 比较大,肯定不能把所有的数据都展示给用…

机器学习基础 线性回归与 Softmax 回归

机器学习基础 线性回归与 Softmax 回归 文章目录 机器学习基础 线性回归与 Softmax 回归1. 最小二乘法1.1 数据集定义1.2 最小二乘的矩阵推导1.3 最小二乘的几何解释1.4 概率视角下的最小二乘估计 2. 正则化2.1 L1 范数与 L2 范数2.2 正则化的作用2.3 Lasso 回归的求解2.3.1 L-…

6.27_JAVA_面试(被抽到了)

1.MYSQL支持的存储引擎有哪些, 有什么区别 ? In-no-DB&#xff08;默认&#xff09;&#xff1a;支持事务安全&#xff08;数据库运行时&#xff0c;能保证数据的一致性、完整性&#xff09;&#xff0c;支持表行锁&#xff0c;支持物理和逻辑外键。占用磁盘空间大。 MEMORY&…

YOLOv13震撼发布:超图增强引领目标检测新纪元

YOLOV13最近发布了&#xff0c;速速来看。 论文标题&#xff1a;YOLOv13&#xff1a;融合超图增强的自适应视觉感知的实时目标检测 论文链接&#xff1a;https://arxiv.org/pdf/2506.17733 代码链接&#xff1a;https://github.com/iMoonLab/yolov13 话不多说&#xff0c;直…

Docker错误问题解决方法

1. Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) https://zhuanlan.zhihu.com/p/24228872523 2. no configuration file provided: …

大模型在恶性心律失常预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 研究创新点 二、大模型技术概述 2.1 大模型基本原理 2.2 常见大模型类型及特点 2.3 大模型在医疗领域的应用现状 三、心律失常的术前预测与准备 3.1 术前心律失常预测的重要性 3.2 大模型在术前预测中的应…

【视频芯片选型】

一、边缘 AI 芯片选型逻辑与未来趋势 &#xff08;一&#xff09;嘉楠 K230、全志 V853、瑞芯微 RK3588 对比选型 核心场景适配 嘉楠 K230&#xff1a; 适合低功耗边缘 AI场景&#xff0c;如智能家居中控&#xff08;支持语音 视觉双模态交互&#xff09;、电池供电设备&#…

JavaScript---DOM篇

1. DOM 概念 文档对象模型&#xff1a;将 HTML 文档映射为树形结构&#xff0c;JS 可通过 DOM 操作页面。 2. 获取元素 document.getElementById(id) document.querySelector(CSS选择器) document.querySelectorAll() 获取多个 3. 操作元素 属性操作&#xff1a; element.getAt…