Golang strconv.Atoi
最后修改于 2025 年 4 月 20 日
本教程将介绍如何在 Go 中使用 strconv.Atoi 函数。我们将通过实际示例涵盖字符串到整数转换的基础知识。
strconv.Atoi 函数将字符串转换为整数。它是 Go 中用于解析数字输入的常用函数之一。
Atoi 是“ASCII to integer”的缩写。该函数返回两个值:解析后的整数和一个错误。这是 Go 处理潜在故障的惯用方法。
基本的 strconv.Atoi 示例
strconv.Atoi 最简单的用法是将数字字符串转换为整数。在这里,我们演示了成功的转换和错误处理。
package main
import (
"fmt"
"strconv"
)
func main() {
numStr := "42"
num, err := strconv.Atoi(numStr)
if err != nil {
fmt.Println("Conversion error:", err)
return
}
fmt.Printf("String '%s' converted to integer %d\n", numStr, num)
}
我们将字符串 "42" 转换为整数。检查错误以处理转换失败的情况。成功的转换会打印整数值。
处理转换错误
strconv.Atoi 会对无效的数字字符串返回错误。本示例展示了针对不同输入情况的正确错误处理。
package main
import (
"fmt"
"strconv"
)
func main() {
testCases := []string{"123", "12.3", "abc", "123abc", ""}
for _, tc := range testCases {
num, err := strconv.Atoi(tc)
if err != nil {
fmt.Printf("'%s' is not a valid integer: %v\n", tc, err)
} else {
fmt.Printf("'%s' converted to %d\n", tc, num)
}
}
}
我们测试了各种字符串输入,包括有效和无效的情况。错误消息有助于识别每次无效输入转换失败的原因。
转换用户输入
一个常见的用例是将命令行参数或用户输入转换为数字。本示例演示了如何从标准输入读取和转换数字。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter a number: ")
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
num, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Please enter a valid integer")
return
}
fmt.Printf("You entered: %d (double: %d)\n", num, num*2)
}
我们读取用户输入,去除空格,然后尝试转换。程序会为无效输入提供反馈,并演示使用转换后的值。
处理不同的进制
虽然 Atoi 只处理十进制,但我们可以使用 ParseInt 来处理其他进制。本示例同时展示了这两种方法。
package main
import (
"fmt"
"strconv"
)
func main() {
// Base 10 with Atoi
num1, _ := strconv.Atoi("42")
fmt.Println("Base 10:", num1)
// Hexadecimal with ParseInt
num2, _ := strconv.ParseInt("2a", 16, 64)
fmt.Println("Hexadecimal:", num2)
// Binary with ParseInt
num3, _ := strconv.ParseInt("1010", 2, 64)
fmt.Println("Binary:", num3)
}
Atoi 等同于 ParseInt(s, 10, 0)。对于其他进制,必须直接使用适当的进制调用 ParseInt。
性能注意事项
对于性能至关重要的代码,避免重复转换可以有所帮助。本示例对 Atoi 与其他方法进行了基准测试。
package main
import (
"fmt"
"strconv"
"time"
)
func main() {
const iterations = 1000000
testStr := "12345"
// Benchmark Atoi
start := time.Now()
for i := 0; i < iterations; i++ {
strconv.Atoi(testStr)
}
fmt.Println("Atoi duration:", time.Since(start))
// Benchmark ParseInt
start = time.Now()
for i := 0; i < iterations; i++ {
strconv.ParseInt(testStr, 10, 64)
}
fmt.Println("ParseInt duration:", time.Since(start))
}
对于十进制转换,Atoi 比 ParseInt 稍快。但是,对于大多数用例,差异通常可以忽略不计。
替代方案:fmt.Sscanf
fmt.Sscanf 提供了另一种从字符串解析整数的方法。本示例将其与 Atoi 进行比较。
package main
import (
"fmt"
"strconv"
)
func main() {
numStr := "42"
// Using Atoi
num1, err1 := strconv.Atoi(numStr)
if err1 != nil {
fmt.Println("Atoi error:", err1)
} else {
fmt.Println("Atoi result:", num1)
}
// Using Sscanf
var num2 int
_, err2 := fmt.Sscanf(numStr, "%d", &num2)
if err2 != nil {
fmt.Println("Sscanf error:", err2)
} else {
fmt.Println("Sscanf result:", num2)
}
}
Sscanf 比 Atoi 更灵活但速度更慢。对于简单的整数转换使用 Atoi,对于更复杂的解析需求使用 Sscanf。
实际示例:求和
这个实际示例演示了如何使用 Atoi 对命令行参数中的数字进行求和,并进行适当的错误处理。
package main
import (
"fmt"
"os"
"strconv"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Please provide numbers to sum")
return
}
var sum int
for _, arg := range os.Args[1:] {
num, err := strconv.Atoi(arg)
if err != nil {
fmt.Printf("'%s' is not a valid number\n", arg)
return
}
sum += num
}
fmt.Println("Sum:", sum)
}
我们遍历命令行参数,将每个参数转换为整数,并累加总和。无效的数字会导致程序终止并显示错误消息。
来源
本教程介绍了 Go 中的 strconv.Atoi 函数,并通过各种场景下的字符串到整数转换的实际示例进行了说明。