ZetCode

Golang strconv.Itoa

最后修改于 2025 年 4 月 20 日

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

strconv.Itoa 函数将整数转换为其字符串表示形式。这是一种将数字格式化为字符串的简单有效的方法。

Itoa 是“integer to ASCII”的缩写。该函数接受一个整数并返回其十进制字符串表示形式。它是 strconv.Atoi 的反向操作。

基本的 strconv.Itoa 示例

strconv.Itoa 最简单的用法是将整数转换为字符串。在这里,我们演示了对不同整数值的基本转换。

basic_itoa.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := 42
    str := strconv.Itoa(num)
    
    fmt.Printf("Integer %d converted to string '%s'\n", num, str)
    
    // Negative number
    negNum := -123
    negStr := strconv.Itoa(negNum)
    fmt.Printf("Integer %d converted to string '%s'\n", negNum, negStr)
}

我们分别将正整数和负整数转换为它们的字符串表示形式。该函数可以处理所有有效的整数值,无需进行错误检查。

格式化不同的整数类型

虽然 Itoa 可以与 int 一起使用,但其他整数类型需要先进行转换。此示例展示了如何处理各种整数类型。

different_types.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // int8
    var num8 int8 = 127
    str8 := strconv.Itoa(int(num8))
    fmt.Println("int8:", str8)
    
    // int64
    var num64 int64 = 9223372036854775807
    str64 := strconv.Itoa(int(num64))
    fmt.Println("int64:", str64)
    
    // uint
    var numUint uint = 42
    strUint := strconv.Itoa(int(numUint))
    fmt.Println("uint:", strUint)
}

我们通过首先将它们转换为 int 来转换不同的整数类型。这确保了与 Itoa 的兼容性,后者只接受 int

将数字与字符串连接

一个常见的用例是构建包含数字的字符串。此示例演示了如何将整数与其他字符串连接。

concatenation.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    age := 30
    name := "Alice"
    
    // Using fmt.Sprintf
    msg1 := fmt.Sprintf("%s is %d years old", name, age)
    fmt.Println(msg1)
    
    // Using strconv.Itoa and string concatenation
    msg2 := name + " is " + strconv.Itoa(age) + " years old"
    fmt.Println(msg2)
    
    // Building a filename
    fileNum := 5
    filename := "data_" + strconv.Itoa(fileNum) + ".txt"
    fmt.Println("Filename:", filename)
}

Itoa 允许直接与数字进行字符串连接。这对于构建文件名或消息等动态字符串非常有用。

与 fmt.Sprintf 的性能比较

对于将整数转换为字符串,Itoafmt.Sprintf 更快。此示例对两种方法进行了基准测试。

performance.go
package main

import (
    "fmt"
    "strconv"
    "time"
)

func main() {
    const iterations = 1000000
    num := 12345
    
    // Benchmark Itoa
    start := time.Now()
    for i := 0; i < iterations; i++ {
        strconv.Itoa(num)
    }
    fmt.Println("Itoa duration:", time.Since(start))
    
    // Benchmark Sprintf
    start = time.Now()
    for i := 0; i < iterations; i++ {
        fmt.Sprintf("%d", num)
    }
    fmt.Println("Sprintf duration:", time.Since(start))
}

对于简单的整数到字符串转换,Itoa 的速度明显快于 fmt.Sprintf。当性能很重要时,请使用 Itoa

替代方法:strconv.FormatInt

为了更好地控制格式,可以使用 strconv.FormatInt。此示例将 ItoaFormatInt 进行比较。

format_int.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := 42
    
    // Using Itoa
    str1 := strconv.Itoa(num)
    fmt.Println("Itoa:", str1)
    
    // Using FormatInt
    str2 := strconv.FormatInt(int64(num), 10)
    fmt.Println("FormatInt:", str2)
    
    // FormatInt with different bases
    hexStr := strconv.FormatInt(int64(num), 16)
    fmt.Println("Hexadecimal:", hexStr)
    
    binStr := strconv.FormatInt(int64(num), 2)
    fmt.Println("Binary:", binStr)
}

Itoa 对于十进制转换更简单,而 FormatInt 提供了更多不同进制的灵活性。根据您的需求进行选择。

实际示例:构建 CSV 行

此示例演示了如何使用 Itoa 为 CSV 输出格式化数据。我们将多个数字字段转换为字符串。

csv_builder.go
package main

import (
    "fmt"
    "strconv"
)

type Product struct {
    ID    int
    Price int
    Stock int
}

func main() {
    p := Product{ID: 1001, Price: 2499, Stock: 42}
    
    csvLine := strconv.Itoa(p.ID) + "," +
               strconv.Itoa(p.Price) + "," +
               strconv.Itoa(p.Stock)
    
    fmt.Println("CSV line:", csvLine)
    
    // Alternative with fmt.Sprintf
    csvLine2 := fmt.Sprintf("%d,%d,%d", p.ID, p.Price, p.Stock)
    fmt.Println("CSV line (fmt):", csvLine2)
}

我们通过将每个数字字段转换为字符串来构建 CSV 行。Itoa 提供了一种轻量级的方式来格式化数字,而不会产生 fmt 的开销。

错误处理边缘情况

虽然 Itoa 不会返回错误,但有一些边缘情况需要考虑。此示例探讨了大数可能出现的问题。

edge_cases.go
package main

import (
    "fmt"
    "math"
    "strconv"
)

func main() {
    // Maximum int value
    maxInt := math.MaxInt
    strMax := strconv.Itoa(maxInt)
    fmt.Println("Max int:", strMax)
    
    // Minimum int value
    minInt := math.MinInt
    strMin := strconv.Itoa(minInt)
    fmt.Println("Min int:", strMin)
    
    // Very large int64 converted to int
    var bigNum int64 = math.MaxInt64
    strBig := strconv.Itoa(int(bigNum)) // Potential overflow
    fmt.Println("Big number:", strBig)
}

Itoa 可以正确处理所有有效的 int 值。但是,首先将较大的类型转换为 int 可能会导致溢出问题。

来源

Go strconv 包文档

本教程通过各种场景下整数到字符串转换的实际示例,涵盖了 Go 中的 strconv.Itoa 函数。

作者

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

列出所有 Go 教程