🚀 可以不是高德,解决 Go 开发者地理位置查询的痛点!

75 阅读2分钟

NetPulse 是一个专为个人开发者打造的轻量级Go库,专门解决地理位置查询的痛点!

个人账号接入高德地图期间,多次被温馨提醒。

咱们作为个人开发者,没有企业资质,接口调用越来越不方便。

🌟 核心优势

🚀 智能故障转移

// 查询当前公网 IP 地址 (多服务商,快速响应)
externalIP, err := ip.ExternalIP()
// 查询当前内网 IP 地址
iip := ip.InternalIP()

🌍 多语言支持

// 中文模式 - 精准中文地区信息
engine := geoip.New(geoip.Chinese)

// 英文模式 - 全球服务
engine := geoip.New(geoip.English)

高性能缓存

// 默认1小时缓存,避免重复调用
info, err := engine.Lookup(ctx, "8.8.8.8") // 自动缓存结果

🛡️ 完全免费

  • 基于免费API服务
  • 无需注册,无需付费
  • 个人开发者友好

📖 快速上手

1️⃣ 安装

go get github.com/ixugo/netpulse

2️⃣ 获取本机IP

package main

import (
    "fmt"
    "log"
    "github.com/ixugo/netpulse/ip"
)

func main() {
    // 获取外网IP
    externalIP, err := ip.ExternalIP()
    if err != nil {
        log.Printf("获取外网IP失败: %v", err)
        return
    }
    fmt.Printf("我的外网IP: %s\n", externalIP)

    // 获取内网IP
    internalIP := ip.InternalIP()
    fmt.Printf("我的内网IP: %s\n", internalIP)
}

3️⃣ 查询地理位置

package main

import (
    "context"
    "fmt"
    "log"
    "github.com/ixugo/netpulse/geoip"
)

func main() {
    // 创建地理位置查询引擎
    engine := geoip.New(geoip.Chinese)

    // 查询IP地理信息
    ctx := context.Background()
    info, err := engine.Lookup(ctx, "8.8.8.8")
    if err != nil {
        log.Printf("查询失败: %v", err)
        return
    }

    fmt.Printf("IP: %s\n", info.IP)
    fmt.Printf("国家: %s\n", info.Country)
    fmt.Printf("省份: %s\n", info.Region)
    fmt.Printf("城市: %s\n", info.City)
    fmt.Printf("运营商: %s\n", info.ISP)
}

4️⃣ 高级用法:自定义服务商

package main

import (
    "context"
    "fmt"
    "github.com/ixugo/netpulse/geoip"
)

func main() {
    // 只使用指定的服务商
    engine := geoip.New(
        geoip.English,
        geoip.WithHandlers(
            geoip.NewFreeIPAPI(),  // freeipapi.com
            geoip.NewIPapi(),      // ipapi.com
        ),
    )

    ctx := context.Background()
    info, err := engine.Lookup(ctx, "114.114.114.114")
    if err != nil {
        fmt.Printf("查询失败: %v\n", err)
        return
    }

    fmt.Printf("IP: %s 位于: %s %s\n", info.IP, info.Region, info.City)
}

⚠️ 使用建议

💡 最佳实践

  1. 添加应用层缓存:避免频繁重复查询同一IP
  2. 遵守服务商条款:合理使用,避免滥用
  3. 企业项目考虑付费:生产环境建议使用付费API

🔧 性能优化

// 建议在应用层添加缓存
var ipCache = make(map[string]*geoip.Info)

func getGeoInfo(ip string) (*geoip.Info, error) {
    if info, exists := ipCache[ip]; exists {
        return info, nil
    }
    // 查询并缓存
    info, err := engine.Lookup(ctx, ip)
    if err == nil {
        ipCache[ip] = info
    }
    return info, err
}

🚀 项目地址

GitHub: github.com/ixugo/netpu…

Go模块: github.com/ixugo/netpulse

⭐ 点亮Star,助力开源!

如果你觉得这个项目对你有帮助,请在GitHub上给项目点个 Star ⭐!让我们一起构建开源生态。

🤝 贡献与反馈

欢迎提交Issue和Pull Request!让我们一起让这个库变得更好。