
base参数指定待解析字符串所采用的进制(如二进制、八进制、十进制或十六进制),是parseint正确识别数字含义的关键,而非输出结果的进制;合理设置base可安全解析不同数制的字符串。
base参数指定待解析字符串所采用的进制(如二进制、八进制、十进制或十六进制),是parseint正确识别数字含义的关键,而非输出结果的进制;合理设置base可安全解析不同数制的字符串。
strconv.ParseInt 是 Go 标准库中用于将字符串安全转换为有符号整数的核心函数,其签名如下:
func ParseInt(s string, base int, bitSize int) (i int64, err error)
其中 base 参数表示输入字符串 s 所使用的数制(即“底数”或“radix”),取值范围为 2–36,常见值包括:
-
2:二进制(仅允许字符'0','1') -
8:八进制(允许'0'–'7';注意:以"0"开头的字符串不会自动按八进制解析,除非显式指定base = 8) -
10:十进制(最常用,允许'0'–'9') -
16:十六进制(允许'0'–'9','a'–'f','A'–'F')
⚠️ 重要澄清:base 不控制返回值的进制格式(返回值始终是内存中的二进制补码整数),它只告诉解析器:“请按第 base 进制规则解读这个字符串”。
例如:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"strconv"
)
func main() {
// 解析二进制字符串 "1111" → 十进制整数 15
if i, err := strconv.ParseInt("1111", 2, 64); err == nil {
fmt.Printf("Binary '1111' → %d (type: %T)\n", i, i) // 输出:15
}
// 解析十六进制字符串 "FF" → 十进制整数 255
if i, err := strconv.ParseInt("FF", 16, 64); err == nil {
fmt.Printf("Hex 'FF' → %d\n", i) // 输出:255
}
// 解析八进制字符串 "17" → 十进制整数 15
if i, err := strconv.ParseInt("17", 8, 64); err == nil {
fmt.Printf("Octal '17' → %d\n", i) // 输出:15
}
// ❌ 错误示例:用 base=16 解析含非法字符的字符串
if _, err := strconv.ParseInt("12G", 16, 64); err != nil {
fmt.Println("Error:", err) // panic: invalid syntax('G' 不在十六进制字符集中)
}
}特别说明 base = 0 的行为:
当 base 设为 0 时,ParseInt 会自动推断进制,规则与 C 语言类似:
- 字符串以
"0x"或"0X"开头 → 按十六进制(base=16)解析 - 以
"0"开头(且非"0x")→ 按八进制(base=8)解析(⚠️ 注意:Go 中"012"会被视为八进制10,而非十进制12) - 其他情况 → 按十进制(base=10)解析
✅ 最佳实践建议:
-
显式指定
base(如10),避免隐式推断带来的歧义和潜在 bug; - 对用户输入或不确定来源的字符串,务必检查
err,不可忽略错误; -
bitSize应根据目标类型选择(如转int用0,转int32用32,转int64用64)。
总之,base 是解析逻辑的“解码钥匙”,确保字符串语义被准确还原为数值——理解并正确使用它,是编写健壮类型转换代码的基础。


















