分享
  1. 首页
  2. 文章

用 golang 封装了一个 ip 地址库

cc14514 · · 3053 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近在做一个 p2p 应用,有一个需求是想根据 peer 的物理距离选择最佳路由,貌似 ip 和距离没什么太直接的关系,搜索了一圈提供这种服务的大多是在线的 rpc ,又慢又有次数和频率限制,更过分的是还有收费的,哎!

苦恼了一下午终于发现了救星 《geoip2-golang》 ,他们维护了一套ip地址库并且提供了模糊的坐标信息,经过一番简单的封装,可以在 golang 程序中非常容易的使用这些信息,我已经在生产环境中使用了这个库,迫不及待分享给有需要的伙伴们。

go-geoip2-db

原码(求星):https://github.com/cc14514/go-geoip2-db

安装

go get https://github.com/cc14514/go-geoip2-db

使用

package geoip2db
import (
 "encoding/json"
 "fmt"
 "net"
 "testing"
)
func TestNewGeoipDbByStatik(t *testing.T) {
 db, _ := NewGeoipDbByStatik()
 defer db.Close()
 record, _ := db.City(net.ParseIP("115.35.95.90"))
 fmt.Printf("Portuguese (BR) city name: %v\n", record.City.Names["pt-BR"])
 fmt.Printf("English subdivision name: %v\n", record.Subdivisions[0].Names["en"])
 fmt.Printf("Russian country name: %v\n", record.Country.Names["ru"])
 fmt.Printf("ISO country code: %v\n", record.Country.IsoCode)
 fmt.Printf("Time zone: %v\n", record.Location.TimeZone)
 fmt.Printf("Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)
}

上面单元测试中得到的 record 结构如下,包含了你想要的全部信息

{
 "City": {
 "GeoNameID": 0,
 "Names": null
 },
 "Continent": {
 "Code": "AS",
 "GeoNameID": 6255147,
 "Names": {
 "de": "Asien",
 "en": "Asia",
 "es": "Asia",
 "fr": "Asie",
 "ja": "アジア",
 "pt-BR": "Ásia",
 "ru": "Азия",
 "zh-CN": "亚洲"
 }
 },
 "Country": {
 "GeoNameID": 1814991,
 "IsInEuropeanUnion": false,
 "IsoCode": "CN",
 "Names": {
 "de": "China",
 "en": "China",
 "es": "China",
 "fr": "Chine",
 "ja": "中国",
 "pt-BR": "China",
 "ru": "Китай",
 "zh-CN": "中国"
 }
 },
 "Location": {
 "AccuracyRadius": 50,
 "Latitude": 39.9289,
 "Longitude": 116.3883,
 "MetroCode": 0,
 "TimeZone": "Asia/Shanghai"
 },
 "Postal": {
 "Code": ""
 },
 "RegisteredCountry": {
 "GeoNameID": 1814991,
 "IsInEuropeanUnion": false,
 "IsoCode": "CN",
 "Names": {
 "de": "China",
 "en": "China",
 "es": "China",
 "fr": "Chine",
 "ja": "中国",
 "pt-BR": "China",
 "ru": "Китай",
 "zh-CN": "中国"
 }
 },
 "RepresentedCountry": {
 "GeoNameID": 0,
 "IsInEuropeanUnion": false,
 "IsoCode": "",
 "Names": null,
 "Type": ""
 },
 "Subdivisions": [
 {
 "GeoNameID": 2038349,
 "IsoCode": "BJ",
 "Names": {
 "en": "Beijing",
 "fr": "Municipalité de Pékin",
 "zh-CN": "北京市"
 }
 }
 ],
 "Traits": {
 "IsAnonymousProxy": false,
 "IsSatelliteProvider": false
 }
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:cc14514

查看原文:用 golang 封装了一个 ip 地址库

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
3053 次点击 ∙ 1 赞
2 回复 | 直到 2019年01月06日 14:04:54
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏