Go --- 一个根据IP查询地址的包geoip2

简介: Go --- 一个根据IP查询地址的包geoip2

IP 地理定位本质上是不精确的。地点通常靠近人口中心。所以如果是用来定位的话,不应该使用IP进行。

简介

这个包是用来解析MaxMind 的GeoLite2GeoIP2 数据库的。这个库是使用Go maxminddb阅读器构建的。数据库记录的所有数据都使用这个库进行解码。

GeoLite2是全球免费的IP地理定位数据库,所以该包的作用是根据IP获取地址、经纬度等详细信息的。

优点:

  • 开源免费
  • 查询速度较快

使用

安装数据库

在使用该包前,我们需要先下载GeoLite2 数据库。

我们使用GeoLite2来演示。

首先先下载GeoLite2,这一步需要注册。

GeoLite2下载地址

当然我们也可以在网上找到GeoLite2数据库Geolite2资源,不需要注册,因为IP是多变的所以使用以前版本的数据库可能会造成数据丢失的问题,建议还是注册一个,毕竟注册后下载是免费的(就是过程有点麻烦)。

GeoLite2免注册下载

下载好后解压出来GeoLite2-City.mmdb文件,把该文件放在项目目录下。

感谢候体宗的博客提供的资源

安装包

go get github.com/oschwald/geoip2-golang

使用代码

package main
import (
   "fmt"
   "github.com/oschwald/geoip2-golang"
   "log"
   "net"
)
func main() {
   // 读取数据库
   db, err := geoip2.Open("./GeoLite2-City.mmdb")
   if err != nil {
      log.Fatal(err)
   }
   defer db.Close()
   // 给定一个ip
   // 如果给定的ip不存在或是空字串,则返回ip为nil
   ip := net.ParseIP("81.2.69.142")
   record, err := db.City(ip)
   if err != nil {
      log.Fatal(err)
   }
   var (
      city      string
      provinces  string
      country    string
      continent  string
      timeZone   string
      latitude   float64
      longitude  float64
   )
   // 城市名称
   if len(record.City.Names) > 0 {
      city = record.City.Names["zh-CN"]
      //fmt.Println(record.City.Names["zh-CN"])
   }
   // 省份
   if len(record.Subdivisions) > 0 {
      if len(record.Subdivisions[0].Names) > 0 {
         provinces = record.Subdivisions[0].Names["zh-CN"]
         //fmt.Println(record.Subdivisions[0].Names["zh-CN"])
      }
   }
   // 国家名
   if len(record.Country.Names) > 0 {
      country = record.Country.Names["zh-CN"]
      //fmt.Println(record.Country.Names["zh-CN"])
   }
   // 洲名
   if len(record.Continent.Names) > 0 {
      continent = record.Continent.Names["zh-CN"]
      //fmt.Println(record.Continent.Names["zh-CN"])
   }
   // 时区
   timeZone = record.Location.TimeZone
   //fmt.Println(record.Location.TimeZone)
   // 纬度
   latitude = record.Location.Latitude
   // 经度
   longitude = record.Location.Longitude
   fmt.Printf("ip所在地为%s-%s-%s-%s,时区为%s,纬度为%f,经度为%f",
      continent, country, provinces, city, timeZone, latitude, longitude)
}

了解更多:

golang-pkg-geoip2

GeoLite2官网文档


相关文章
|
9月前
|
Go 开发者
Go语言包的组织与导入 -《Go语言实战指南》
本章详细介绍了Go语言中的包(Package)概念及其使用方法。包是实现代码模块化、复用性和可维护性的核心单位,内容涵盖包的基本定义、命名规则、组织结构以及导入方式。通过示例说明了如何创建和调用包,并深入讲解了`go.mod`文件对包路径的管理。此外,还提供了多种导入技巧,如别名导入、匿名导入等,帮助开发者优化代码结构与可读性。最后以表格形式总结了关键点,便于快速回顾和应用。
368 61
|
5月前
|
Java 编译器 Go
【Golang】(1)Go的运行流程步骤与包的概念
初次上手Go语言!先来了解它的运行流程吧! 在Go中对包的概念又有怎样不同的见解呢?
290 4
|
8月前
|
JSON 中间件 Go
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
410 63
|
8月前
|
监控 安全 Go
使用Go语言构建网络IP层安全防护
在Go语言中构建网络IP层安全防护是一项需求明确的任务,考虑到高性能、并发和跨平台的优势,Go是构建此类安全系统的合适选择。通过紧密遵循上述步骤并结合最佳实践,可以构建一个强大的网络防护系统,以保障数字环境的安全完整。
175 12
|
8月前
|
存储 中间件 网络安全
在Go中构建应用级IP防火墙机制
使用Go构建应用级别的IP防火墙机制不仅能够为你的应用程序增加一层额外的安全性,还能够通过自定义中间件的方式让你有更多控制力,来决定哪些客户端可以或不可以访问你的服务。
235 8
|
7月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
492 0
|
10月前
|
Go 持续交付 开发者
Go语言包与模块(module)的基本使用-《Go语言实战指南》
本章深入讲解Go语言中的包(Package)和模块(Module)概念。包是代码组织的最小单位,每个`.go`文件属于一个包,通过`import`实现复用;主程序包需命名为`main`。模块是Go 1.11引入的依赖管理机制,支持自动版本管理和私有/远程仓库,无需依赖GOPATH。通过实际示例,如自定义包`mathutil`和第三方模块`gin`的引入,展示其使用方法。常用命令包括`go mod init`、`go mod tidy`等,帮助开发者高效管理项目依赖。最后总结,包负责功能划分,模块实现现代化依赖管理,提升团队协作效率。
398 15
|
11月前
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
644 2
|
SQL JSON 关系型数据库
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:列表查询规则指南
GoWind Admin|风行是一款开箱即用的企业级Go语言中后台框架,提供配置化、高兼容的列表查询规则,支持多条件筛选、排序分页、字段过滤等功能,兼容多种数据库,显著提升开发效率与系统可维护性。
250 0
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 "Definition",可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
657 9
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev

热门文章

最新文章