Skip to content

🌍 country — ISO 2 位国家代码

🏷️ 字段类别:国家 · 🔑 JSON Key:country · 🧩 Go 字段:IPInfo.Country

🎨 一图抵千言

countryIPInfo 结构体中所属分组与相关字段关系如下:

country 归属于 geo(地理) 分组,与 country_code 取值一致,并与 country_namecountry_code_iso3 等共同构成国家维度的字段族。


📐 字段定义

IPInfo 结构体中对应的 JSON tag 行如下:

go
Country string `json:"country"`

完整的字段定义位于 models.goIPInfo 结构体内。


📖 含义

🎯 country 表示目标 IP 地址所属国家的 ISO 3166-1 alpha-2(2 位字母)国家代码

  • 🇺🇸 例如:US 代表美国(United States)
  • 🇨🇳 例如:CN 代表中国(China)
  • 🇯🇵 例如:JP 代表日本(Japan)
  • 🇩🇪 例如:DE 代表德国(Germany)

该代码由国际标准化组织(ISO)维护,是全球通用的国家标识符,常用于地理统计、风控、合规区域判断等场景。

💡 与 country_code 等价

country 与同结构体内的 country_code 在 ipapi.co 的响应中取值完全一致,两者都返回 ISO 3166-1 alpha-2 代码。区别仅在 JSON key 名不同:country 是早期即沿用的简短键名,country_code 是语义更明确的命名键。二者可互换使用,任选其一即可。


🔬 类型说明

属性
Go 类型string
JSON Keycountry
是否指针字段❌ 否(直接为 string,非 *string
是否 omitempty❌ 否

⚠️ 关于指针字段与 omitempty 的特别说明

Country 本身是普通的 string 类型,不是 指针字段,因此可以直接访问,无需判空。

IPInfo 结构体中确实存在指针类型字段,例如:

go
Postal *string `json:"postal"`

对于这类 *string 指针字段:

  • 🚫 直接解引用 *info.Postal 在值为 nil 时会触发 panic
  • ✅ SDK 提供了安全访问方法 GetPostal(),内部已做 nil 判断:
go
func (info *IPInfo) GetPostal() string {
    if info.Postal == nil {
        return ""
    }
    return *info.Postal
}

对于带有 omitempty 的字段(如 Hostname string \json:"hostname,omitempty"`),当 API 返回中不包含该字段时,Go 端会保留零值(空字符串),调用方需自行处理空值语义。而 country既非指针也非omitempty`,访问最为直接。

📝 注意:Country 字段本身没有专属的 Get 访问器方法(不像 PostalGetPostal()),因为它不是指针字段,直接读取 info.Country 即可,无需额外封装。


📌 示例值

text
US

常见取值参考:

国家country
美国US
中国CN
日本JP
德国DE
英国GB
法国FR
巴西BR
印度IN

🛠️ 访问方式

1️⃣ 结构体字段访问

通过 GetIPInfo 拿到完整的 *IPInfo 后,直接读取字段:

go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/cyberspacesec/ipapi.co-skills/pkg/ipapi"
)

func main() {
    client := ipapi.NewClient()
    info, err := client.GetIPInfo(context.Background(), "8.8.8.8", "json")
    if err != nil {
        log.Fatal(err)
    }

    // 直接访问 Country 字段
    fmt.Println("国家代码:", info.Country) // 输出: US
}

2️⃣ GetField 单字段查询

只需查询 country 这一个字段时,使用 GetField 更轻量,仅发起一次单字段请求:

go
code, err := client.GetField(ctx, "8.8.8.8", "country")
if err != nil {
    log.Fatal(err)
}
fmt.Println("国家代码:", code) // 输出: US

💡 GetField 返回的是原始字符串(API 原始响应体),无需解析整个 JSON,适合只关心单个字段的场景。

3️⃣ GetClientField 查询本机 IP 的字段

查询当前发起请求的客户端 IPcountry(不传 IP 参数,对应 GET /{field}/ 端点):

go
code, err := client.GetClientField(ctx, "country")
if err != nil {
    log.Fatal(err)
}
fmt.Println("本机 IP 国家代码:", code)

🧭 GetFieldGetClientField 的区别:前者需要显式传入目标 IP(GET /{ip}/{field}/),后者针对调用方自身 IP(GET /{field}/)。


🎯 用途

country 在实际业务中应用广泛,典型场景包括:

  • 🌍 地理定位:根据 IP 快速判定用户所在国家,用于本地化内容展示、语言切换。
  • 🛡️ 风控与反欺诈:识别异常登录国家的异地登录、批量注册等可疑行为。
  • ⚖️ 合规与区域限制:依据 GDPR、内容审查等要求,对特定国家流量做放行或拦截。
  • 📊 统计分析:按国家维度聚合访问量、用户分布等业务指标。
  • 🚚 物流与电商:根据国家代码匹配运费模板、税费规则、可用支付方式。
  • 🔁 与 ISO 3166-1 alpha-3 互补:与 country_code_iso3(3 位代码,如 USA)配合使用,满足不同系统的编码要求。
  • 🏳️ 与同义字段互换:与 country_code 等价,可按团队命名习惯任选其一。

🔗 相关字段

  • 📚 字段总览 — 查看所有可用字段的全景列表。
  • 🏳️ 国家类字段分类页 — 浏览与国家相关的全部字段(countrycountry_namecountry_codecountry_code_iso3country_capitalcountry_tldcountry_calling_codecountry_areacountry_population 等)。

🚀 下一步

  • 📖 阅读 字段总览,了解 country 在整个字段体系中的位置。
  • 🏳️ 进入 国家类字段分类页,对比 countrycountry_namecountry_codecountry_code_iso3 的差异。
  • 🧪 参考仓库 main.go 运行一个完整的查询示例。
  • 🔍 试用 GetField 单字段查询其他字段,如 asntimezonecurrency,体会不同字段类型的返回差异。

🗂️ 字段速查

字段速查表
属性
JSON Keycountry
Go 字段IPInfo.Country
Go 类型string
分组geo(地理)
示例值US
是否指针字段
是否 omitempty
同义字段country_code

基于 MIT 许可证发布