ZetCode

Golang strconv.Atoi

最后修改于 2025 年 4 月 20 日

本教程将介绍如何在 Go 中使用 strconv.Atoi 函数。我们将通过实际示例涵盖字符串到整数转换的基础知识。

strconv.Atoi 函数将字符串转换为整数。它是 Go 中用于解析数字输入的常用函数之一。

Atoi 是“ASCII to integer”的缩写。该函数返回两个值:解析后的整数和一个错误。这是 Go 处理潜在故障的惯用方法。

基本的 strconv.Atoi 示例

strconv.Atoi 最简单的用法是将数字字符串转换为整数。在这里,我们演示了成功的转换和错误处理。

basic_atoi.go
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 会对无效的数字字符串返回错误。本示例展示了针对不同输入情况的正确错误处理。

error_handling.go
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)
        }
    }
}

我们测试了各种字符串输入,包括有效和无效的情况。错误消息有助于识别每次无效输入转换失败的原因。

转换用户输入

一个常见的用例是将命令行参数或用户输入转换为数字。本示例演示了如何从标准输入读取和转换数字。

user_input.go
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 来处理其他进制。本示例同时展示了这两种方法。

number_bases.go
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 与其他方法进行了基准测试。

performance.go
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))
}

对于十进制转换,AtoiParseInt 稍快。但是,对于大多数用例,差异通常可以忽略不计。

替代方案:fmt.Sscanf

fmt.Sscanf 提供了另一种从字符串解析整数的方法。本示例将其与 Atoi 进行比较。

sscanf.go
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)
    }
}

SscanfAtoi 更灵活但速度更慢。对于简单的整数转换使用 Atoi,对于更复杂的解析需求使用 Sscanf

实际示例:求和

这个实际示例演示了如何使用 Atoi 对命令行参数中的数字进行求和,并进行适当的错误处理。

sum_numbers.go
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 包文档

本教程介绍了 Go 中的 strconv.Atoi 函数,并通过各种场景下的字符串到整数转换的实际示例进行了说明。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程