net.parseip仅校验纯ip格式,不支持端口/cidr/方括号;拆host:port必须用net.splithostport;构建连接地址应优先用net.resolvetcpaddr;三者职责分明,混用或忽略错误检查将导致90%的问题。

直接用 net.ParseIP 判断字符串是不是合法 IP,用 net.SplitHostPort 拆带端口的地址,用 net.ResolveTCPAddr 构建可监听/连接的地址结构——三者分工明确,混用或跳过判空,90% 的问题就出在这儿。
net.ParseIP 只认纯 IP 字符串,不支持端口、CIDR、方括号
它只接受标准 IPv4(如 "192.168.1.1")或 IPv6(如 "2001:db8::1"),其他一律返回 nil。常见静默失败场景:
- 输入含换行或空格(如
"127.0.0.1\n")→ 先strings.TrimSpace - 来自 URL 或日志的 IPv6 地址带方括号(如
"[::1]")→ 手动去掉"["和"]"再传 - 误传
"localhost"或"192.168.1.1/24"→ 前者该走net.LookupIP,后者该用net.ParseCIDR - IPv4-mapped IPv6 地址(如
"::ffff:192.168.1.1")能被解析,但.To4()才能识别为 IPv4
拆 "host:port" 必须用 net.SplitHostPort,不能硬切冒号
net.SplitHostPort 是唯一能正确处理 IPv6 方括号的函数,比如把 "[::1]:8080" 拆成 host = "::1"、port = "8080";而 strings.Split(s, ":") 在 IPv6 上会错切成三段。
- 拆完的
host再喂给net.ParseIP校验是否为字面量 IP - 若
net.ParseIP(host) == nil,说明是域名,后续需调net.LookupIP解析 - 永远检查
err != nil:非法格式(如"127.0.0.1:abc")会报*net.AddrError - 不要对
host直接做strings.Contains(host, ":")来判断 IPv6——"localhost"也可能含冒号
构建可连接地址优先用 net.ResolveTCPAddr,不是拼字符串
net.ResolveTCPAddr("tcp", "example.com:443") 会先 DNS 解析再构造地址,而 &net.TCPAddr{IP: ip, Port: 443} 要求你已拿到 net.IP。实际开发中:
- 客户端连接:用
net.ResolveTCPAddr更安全,它自动处理 DNS + 端口校验(端口超出 1–65535 直接报错) - 服务器监听:若监听地址来自配置,建议先
net.SplitHostPort拆,再net.ParseIP判是否为本地 IP,最后用net.Listen("tcp", addr) - IPv6 地址必须带方括号才能被
net.ResolveTCPAddr正确识别(如"[2001:db8::1]:80"),否则会被当 IPv4 解析失败 -
network参数选"tcp4"或"tcp6"可强制协议栈,但"tcp"支持双栈,更通用
查归属地、反向 DNS、MX 记录别指望 net.ParseIP 或 net.LookupHost
net.ParseIP 不查地理位置,net.LookupAddr 查的是 PTR 记录(IP → 域名),和物理位置无关;net.LookupHost 只查 A/AAAA,不支持 MX/TXT/CNAME。
- 要查归属地:用
ip2region(离线快)或maxminddb(需 GeoLite2 数据库),别拿net.LookupAddr("8.8.8.8")的结果当国家信息 - 要查 MX 记录:必须用
net.Resolver实例调LookupMX,net.LookupIP完全不提供该能力 - 要控制 DNS 超时或指定服务器:绕不开
net.Resolver,且必须设PreferGo: true+ 自定义Dial函数,否则仍走系统 resolver -
net.LookupIP返回多个 IP 时,顺序不保证,业务若需轮询或健康检查,得自己加逻辑
真正容易被忽略的是:所有解析函数返回的 net.IP 是 []byte,IPv4 长 4 字节、IPv6 长 16 字节,直接比较或序列化前务必确认类型;而 net.Resolver 的 Dial 字段必须是函数,不是字符串地址——写成 Dial: "8.8.8.8:53" 会静默 fallback 到系统行为。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











