用 strconv.ParseInt("ff", 16, 64) 可正确将十六进制字符串转为十进制数255;必须显式指定进制16,传0需前缀如"0xff",且须处理返回的error,输入前应TrimSpace。

十六进制字符串转十进制数,用 strconv.ParseInt 最直接
Go 里没有类似 Python 的 int("ff", 16) 这种简洁写法,必须用 strconv.ParseInt,且必须显式指定进制。漏掉进制参数或传错值(比如写成 10)会导致解析出错或结果完全不对。
常见错误现象:strconv.ParseInt("ff", 10, 64) 会返回 error: strconv.ParseInt: parsing "ff": invalid syntax —— 因为它按十进制去解析字母,自然失败。
-
strconv.ParseInt("ff", 16, 64)正确:返回255和nil - 进制参数只能是
0或2~36;16是唯一合法的十六进制值 - 位宽参数(第三个参数)选
64最稳妥,避免溢出;若确定数值小,可用32或8,但需自行校验范围
strconv.ParseInt 的进制参数为 0 时怎么处理
传 0 表示“自动推断进制”,但只认前缀:"0x" 或 "0X" 触发十六进制,"0" 开头(如 "0755")触发八进制,否则默认十进制。不识别 "0xff" 以外的变体(比如没前缀的 "ff" 仍按十进制解析)。
-
strconv.ParseInt("0xff", 0, 64)→255 -
strconv.ParseInt("ff", 0, 64)→error(无前缀,按十进制解析失败) -
strconv.ParseInt("0755", 0, 64)→493(八进制)
所以,明确要解析十六进制时,别依赖 0,老老实实传 16 更可靠、更易读。
立即学习“go语言免费学习笔记(深入)”;
解析失败时的 error 处理不能省略
strconv.ParseInt 返回 (int64, error),而 Go 不允许忽略 error。常见疏忽是只取第一个返回值,或者用 _ 忽略 error,结果程序在非法输入下 panic 或行为异常。
- 错误类型通常是
*strconv.NumError,可类型断言判断具体原因 - 典型错误信息:
"strconv.ParseInt: parsing \"xyz\": invalid syntax"或"strconv.ParseInt: parsing \"100000000000000000000\": value out of range" - 不要用
panic处理业务错误;应返回自定义 error 或 fallback 值(如0),并记录日志
示例片段:
num, err := strconv.ParseInt("ff", 16, 64)
if err != nil {
// 处理 err,比如 log.Printf("parse hex failed: %v", err)
return 0
}
// 使用 num
注意大小写和空格——strconv.ParseInt 不自动 trim 或忽略
函数对输入极其严格:开头结尾有空格、字母大小写混用("FF" 可以,"fF" 也可以,十六进制 a–f 不区分大小写),但任何非数字/非有效字母字符都会报错。
-
strconv.ParseInt(" ff ", 16, 64)→error(带空格) -
strconv.ParseInt("0xFF", 16, 64)→error(0x前缀仅在进制=0时有效) - 安全做法:先用
strings.TrimSpace清空两端空格,再解析
如果输入来源不可控(比如 HTTP query 参数、配置文件),务必做预处理,否则看似简单的转换会频繁失败。


















