Go语言怎么做地理围栏_Go语言地理位置计算教程【指南】
最稳的IP地理围栏方案是用oschwald/maxminddb-golang读取GeoLite2-City.mmdb配合CF-Connecting-IP或Nginx可信IP头获取真实IP白名单用map、围栏用S2库做点面判断高实时场景选Tile38。用 maxminddb 查 IP 归属做围栏别碰 geoip2Go 官方不带 GeoIP 支持必须靠第三方库读取 GeoLite2-City.mmdb。最稳的选择是 oschwald/maxminddb-golang——纯 Go 实现、零 C 依赖、内存映射友好适合高并发服务。geoip2 库已归档它只是对 maxminddb 的一层封装字段访问绕、更新停滞还容易因嵌套结构解错字段。下载数据库到本地比如 /etc/geoip/GeoLite2-City.mmdb别放进 Git 或临时目录全局复用一个 *maxminddb.Reader别每次请求都调 maxminddb.Open()否则文件句柄和 mmap 开销会拖垮性能定义 record 结构体时只声明你要的字段比如type CityRecord struct { Country struct { IsoCode string maxminddb:iso_code } maxminddb:country City struct { Names map[string]string maxminddb:names } maxminddb:city}查 IPv6 也一样传 net.ParseIP(2001:db8::1)不是字符串net.ParseIP 对 v4/v6 都兼容HTTP 中间件里做地理拦截真实 IP 怎么拿才靠谱地理围栏拦错人90% 出在 IP 拿错了。别信 X-Forwarded-For它能被客户端伪造。真正可信的来源取决于你前面有没有 Nginx、Cloudflare 或 ALB。如果用了 Cloudflare优先读 CF-Connecting-IP 头Nginx 配了 set_real_ip_from real_ip_recursive on再用 req.RemoteAddr 才可靠中间件里别写 strings.Split(req.Header.Get(X-Forwarded-For), ,)[0] —— 这等于开门揖盗查库前加超时控制ctx, cancel : context.WithTimeout(r.Context(), 100*time.Millisecond)避免磁盘卡顿或损坏 DB 拖死整个 handler白名单匹配建议用 map[string]bool{CN: true, JP: true}O(1) 查别用 slice 遍历用 S2 做点在多边形内判断比手写 PIP 快一个数量级IP 归属只能到城市/国家真要判断“用户是否在某个园区、商圈、机场跑道内”得上经纬度 多边形围栏。这时候 S2 库如 github.com/golang/geo/s2比自己实现光线投射或射线法快得多且精度可控、支持层级索引。 Mokker AI AI产品图添加背景