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


相关文章
|
13天前
|
编译器 数据库连接 Go
Go Sync 包:并发的 6 个关键概念
Go Sync 包:并发的 6 个关键概念
|
15天前
|
存储 SQL Go
一文弄懂Go语言的Context包,值得收藏!
在开发高效的Go应用程序时,处理超时、取消操作和传递请求范围的数据至关重要。Go标准库中的`context`包提供了一套强大的工具,用于在不同层级间传递取消信号、超时和截止时间等信息。本文首先概述了`context`包的核心功能,接着详细介绍了关键方法,如`WithCancel`、`WithDeadline`、`WithTimeout`和`WithValue`的使用场景。通过创建和派生上下文,开发者能更好地管理请求的生命周期,控制长时间运行的操作,并在并发环境中传递必要的数据。
27 1
|
1月前
|
存储 Go
go语言中fmt格式化包和内置函数汇总
【7月更文挑战第10天】本文介绍fmt包和`Errorf`用于创建格式化的错误消息。`fmt`包还涉及一些接口,如`Formatter`、`GoStringer`、`ScanState`、`Scanner`和`Stringer`,支持自定义格式化和输入/输出处理。
33 1
|
22天前
|
Go
go使用snmp库查询mib数据
go使用snmp库查询mib数据
29 0
|
2月前
|
Go
go安装三方包并使用
go安装三方包并使用
27 4
|
2月前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
2月前
|
程序员 Go
【Go语言精进之路】Go语言fmt包深度探索:格式化输入输出的利器
【Go语言精进之路】Go语言fmt包深度探索:格式化输入输出的利器
41 3
|
2月前
|
SQL Go
Go语言之GORM框架(三)——Hook(钩子)与Gorm的高级查询
Go语言之GORM框架(三)——Hook(钩子)与Gorm的高级查询
|
2月前
|
消息中间件 Kafka Go
go语言并发实战——日志收集系统(五) 基于go-ini包读取日志收集服务的配置文件
go语言并发实战——日志收集系统(五) 基于go-ini包读取日志收集服务的配置文件
|
2月前
|
存储 监控 算法
go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控
go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控