
本文详解如何安全地将字符串中的数字字符转换为整数并计算其乘积,重点解决空指针异常、初始值错误和错误处理逻辑颠倒等常见问题。
本文详解如何安全地将字符串中的数字字符转换为整数并计算其乘积,重点解决空指针异常、初始值错误和错误处理逻辑颠倒等常见问题。
在 Go 中对数字字符串进行逐位解析与运算时,需特别注意类型转换的安全性与循环边界控制。原始代码存在三个关键缺陷:一是乘积累积变量 `mult` 初始化为 `0`,导致后续所有乘法结果恒为 `0`;二是错误检查逻辑反向(使用 `err != nil` 但分支内却调用 `int(digit)`,而 `digit` 仅在转换成功时才有效);三是未校验索引越界,`startIndex+i` 可能超出字符串长度,引发 panic。修复后的完整可运行代码如下:
package main
import (
"fmt"
"strconv"
)
func main() {
inputNum := "73167176531330624919225119"
// 计算从索引 3 开始的连续 10 个数字的乘积:6*7*1*7*6*5*3*1*3*3 = 238140
mult := getMult(3, 10, inputNum)
fmt.Printf("Mult = %d\n", mult)
}
func getMult(startIndex, length int, inputNum string) int {
// 安全性检查:防止索引越界
if startIndex < 0 || startIndex+length > len(inputNum) {
panic(fmt.Sprintf("index out of bounds: startIndex=%d, length=%d, len(inputNum)=%d",
startIndex, length, len(inputNum)))
}
mult := 1 // ✅ 必须初始化为 1,而非 0
for i := 0; i < length; i++ {
char := inputNum[startIndex+i]
// 确保字符是数字(可选增强健壮性)
if char < '0' || char > '9' {
panic(fmt.Sprintf("invalid digit character '%c' at position %d", char, startIndex+i))
}
digit, err := strconv.Atoi(string(char))
if err == nil { // ✅ 正确逻辑:仅在转换成功时参与运算
mult *= digit
} else {
panic(fmt.Sprintf("failed to convert '%c': %v", char, err))
}
}
return mult
}关键要点总结:
- 初始值必须为 1:乘法累积的单位元是 1,初始化为 0 会使整个结果归零;
- 错误判断必须为 err == nil:只有转换成功才使用 digit,否则访问未定义值或调用 err.Error()(当 err 为 nil 时会 panic);
- 主动校验索引边界:避免运行时 panic,提升程序鲁棒性;
- 可选字符预检:直接比对 ASCII 范围 '0'–'9' 比依赖 strconv.Atoi 更高效且可控。
运行上述代码将准确输出:Mult = 238140,符合预期目标。

















