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
函数,并通过各种场景下的字符串到整数转换的实际示例进行了说明。