既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
maxmind
提供了免费的可在本地部署的geo-ip数据库(GeoLite2)(mmdb以及csv格式),和geo-ip查询api服务。- 支持ipv4和ipv6的地理信息查询,以及ASN数据库(ip-运营商信息查询)
- 免费的数据库
更新周期为两周一次
,需要付费才能得到最快的更新速度。
1.3 总结
推荐优先使用 geoip2-golang
,其次是ip2region
,如果需要更加精确的话,建议选择商用的。
2 使用
2.1 ip2region
- 下载ip地址库
到github:https://github.com/lionsoul2014/ip2region下载代码。 ip2region
的库
在data
下的ip2region.xdb
- 使用
package main
import (
"fmt"
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
"net"
"time"
)
func main() {
ip2region()
}
func ip2region() {
var dbPath = "iputil/ip2region/ip2region.xdb"
searcher, err := xdb.NewWithFileOnly(dbPath)
if err != nil {
fmt.Printf("failed to create searcher: %s\n", err.Error())
return
}
defer searcher.Close()
var ip = "115.223.9.122"
var tStart = time.Now()
ips, err := net.LookupIP("www.github.com")
ipres := ips[0].String()
fmt.Printf("域名的ip:%s\n", ipres)
region, err := searcher.SearchByStr(ip)
if err != nil {
fmt.Printf("failed to SearchIP(%s): %s\n", ip, err)
return
}
fmt.Printf("{region: %s, took: %s}\n\n", region, time.Since(tStart))
// 备注:并发使用,每个 goroutine 需要创建一个独立的 searcher 对象。
}
结果:
域名的ip:20.205.243.166
{region: 中国|0|浙江省|温州市|电信, took: 70.8846ms}
2.2 geoip2-golang
geoip2-golang
只是一个使用示例,它所需的IP地理信息库是基于MaxMind
提供的 GeoLite2
和 GeoIP2
数据库。所以需要去MAXMID
官网注册账号,然后才能下载最新的IP地理位置库
。
- 注册
地址:https://www.maxmind.com/en/geolite2/signup,除了邮箱外,其他都不需要真实信息。 - 登录
- 下载最新的
IP地理位置库
登陆后点击 Download Databases进入下载选择页面
- 下载库文件
maxmind提供了六种免费的数据库,有mmdb
【推荐】,也有csv
格式。你也可以全部下载下来看看。
ASN数据库
从图中可以看到有些数据库的标题后面写着“ASN”三个字母,这个ASN的指的就是ip-运营商信息的数据库。
mmdb数据库
mmdb
是maxmind
自己的一种二进制数据库格式,它提供较快的ip查询速度。
这里我们只下载不是CSV格式
的库文件即可,即只下载红色圈起来的,右侧是下载按钮。
注意:MAXMIND
会记录下载,所以不要反复下载,以免被禁。
- 库文件
- GeoLite2-ASN_20230505.tar.gz
- GeoLite2-City_20230505.tar.gz
- GeoLite2-Country_20230505.tar.gz
解压后都是mmdb数据库类型,具体差别自己测试吧。
- 使用
- 下载
geoip2-golang
go get github.com/oschwald/geoip2-golang
代码示例:
package main
import (
"fmt"
"github.com/lionsoul2014/ip2region/binding/golang/xdb"
"github.com/oschwald/geoip2-golang"
"log"
"net"
"time"
)
func main() {
ip2region()
geoip()
}
func ip2region() {
var dbPath = "iputil/ip2region/ip2region.xdb"
searcher, err := xdb.NewWithFileOnly(dbPath)
if err != nil {
fmt.Printf("failed to create searcher: %s\n", err.Error())
return
}
defer searcher.Close()
var ip = "115.223.9.122"
var tStart = time.Now()
ips, err := net.LookupIP("www.github.com")
ipres := ips[0].String()
fmt.Printf("域名的ip:%s\n", ipres)
region, err := searcher.SearchByStr(ip)
if err != nil {
fmt.Printf("failed to SearchIP(%s): %s\n", ip, err)
return
}
fmt.Printf("{region: %s, took: %s}\n\n", region, time.Since(tStart))
// 备注:并发使用,每个 goroutine 需要创建一个独立的 searcher 对象。
}
func geoip() {
db, err := geoip2.Open("iputil/geolite2/GeoLite2-City.mmdb")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// If you are using strings that may be invalid, check that ip is not nil
//ip := net.ParseIP("81.2.69.142")
ip := net.ParseIP("115.192.211.101")
record, err := db.City(ip)
![img](https://img-blog.csdnimg.cn/img_convert/8bc9d873b4b145fefd87a40619d43257.png)
![img](https://img-blog.csdnimg.cn/img_convert/3b4daadeb70c2671b5d98fbd1a8a1c94.png)
![img](https://img-blog.csdnimg.cn/img_convert/6bd3965624cc33a50dd5f459cf1b31f5.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**