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官网文档


相关文章
|
6天前
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 "Definition",可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
25 7
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
|
20天前
|
Go 索引
go语言使用strings包
go语言使用strings包
23 3
|
1月前
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
30 3
|
2月前
|
存储 Go 数据库
Go语言Context包源码学习
【10月更文挑战第21天】Go 语言中的 `context` 包用于在函数调用链中传递请求上下文信息,支持请求的取消、超时和截止时间管理。其核心接口 `Context` 定义了 `Deadline`、`Done`、`Err` 和 `Value` 方法,分别用于处理截止时间、取消信号、错误信息和键值对数据。包内提供了 `emptyCtx`、`cancelCtx`、`timerCtx` 和 `valueCtx` 四种实现类型,满足不同场景需求。示例代码展示了如何使用带有超时功能的上下文进行任务管理和取消。
|
3月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
65 3
|
4月前
|
编译器 数据库连接 Go
Go Sync 包:并发的 6 个关键概念
Go Sync 包:并发的 6 个关键概念
|
4月前
|
存储 SQL Go
一文弄懂Go语言的Context包,值得收藏!
在开发高效的Go应用程序时,处理超时、取消操作和传递请求范围的数据至关重要。Go标准库中的`context`包提供了一套强大的工具,用于在不同层级间传递取消信号、超时和截止时间等信息。本文首先概述了`context`包的核心功能,接着详细介绍了关键方法,如`WithCancel`、`WithDeadline`、`WithTimeout`和`WithValue`的使用场景。通过创建和派生上下文,开发者能更好地管理请求的生命周期,控制长时间运行的操作,并在并发环境中传递必要的数据。
57 1
|
4月前
|
Go 开发者
|
4月前
|
编译器 Go 开发者
|
4月前
|
缓存 Go
Go引用包版本更新但是被引用的包的子包并没有出现在vendor中的问题和解决方案
文章讨论了在Go模块项目中升级依赖包版本时遇到的子包未出现在vendor目录的问题,并提供了直接删除旧版本引用并重新执行`go mod vendor`的解决方案。
47 0