ZetCode

Golang strconv.AppendUint

最后修改于 2025 年 4 月 20 日

本教程将讲解如何在 Go 中使用 strconv.AppendUint 函数。我们将通过实际示例介绍无符号整数到字节切片的转换。

strconv.AppendUint 函数将无符号整数的字符串表示形式追加到字节切片。它对于构建格式化输出非常高效。

当您需要构建包含数字值的字符串或字节切片,而又不想创建中间字符串对象时,AppendUint 特别有用。

基本的 strconv.AppendUint 示例

strconv.AppendUint 最简单的用法是将无符号整数追加到字节切片。这里我们演示了使用 10 进制转换的基本用法。

basic_appenduint.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := []byte("Number: ")
    num := uint64(42)
    
    buf = strconv.AppendUint(buf, num, 10)
    fmt.Println(string(buf))
}

我们从一个包含 "Number: " 的字节切片开始。我们将 42 的字符串表示形式追加到它。结果将作为字符串打印。

使用不同的进制

strconv.AppendUint 支持不同的数字进制。本示例展示了十六进制、二进制和八进制表示。

different_bases.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := uint64(255)
    
    buf10 := strconv.AppendUint([]byte{}, num, 10)
    buf16 := strconv.AppendUint([]byte{}, num, 16)
    buf2 := strconv.AppendUint([]byte{}, num, 2)
    buf8 := strconv.AppendUint([]byte{}, num, 8)
    
    fmt.Println("Decimal:", string(buf10))
    fmt.Println("Hexadecimal:", string(buf16))
    fmt.Println("Binary:", string(buf2))
    fmt.Println("Octal:", string(buf8))
}

我们将同一个数字(255)转换为不同的进制。每次转换都从一个空的字节切片开始。结果显示了不同的字符串表示。

构建格式化字符串

本示例演示了如何使用多个 AppendUint 调用和其他追加操作来构建复杂的格式化字符串。

formatted_string.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := []byte("Values: ")
    
    for i := uint64(1); i <= 5; i++ {
        buf = strconv.AppendUint(buf, i, 10)
        buf = append(buf, ' ')
    }
    
    fmt.Println(string(buf))
}

我们从 "Values: " 开始,然后追加数字 1 到 5,中间用空格隔开。结果是一个高效构建的单个字符串,没有临时分配。

追加到现有数据

本示例展示了 AppendUint 如何追加到包含其他数据的现有字节切片,同时保留原始内容。

existing_data.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    data := []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f} // "Hello" in ASCII
    num := uint64(12345)
    
    result := strconv.AppendUint(data, num, 10)
    fmt.Println(string(result))
}

我们从一个包含 "Hello" 的字节切片开始。我们将数字 12345 追加到它。结果将原始字节与新的数字表示结合起来。

性能比较

本示例将 AppendUint 与字符串连接进行比较,以展示其性能优势。

performance.go
package main

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

func main() {
    const iterations = 100000
    num := uint64(42)
    
    // Using AppendUint
    start := time.Now()
    buf := []byte{}
    for i := 0; i < iterations; i++ {
        buf = strconv.AppendUint(buf[:0], num, 10)
    }
    fmt.Println("AppendUint duration:", time.Since(start))
    
    // Using string concatenation
    start = time.Now()
    s := ""
    for i := 0; i < iterations; i++ {
        s = strconv.FormatUint(num, 10)
    }
    fmt.Println("FormatUint duration:", time.Since(start))
}

对于构建复杂的输出,AppendUint 通常比字符串连接更有效。它避免了创建中间字符串对象。

使用无效进制的错误处理

虽然 AppendUint 不返回错误,但使用无效进制有其定义好的行为。本示例探讨了边界情况。

invalid_bases.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    num := uint64(42)
    
    // Valid base
    buf10 := strconv.AppendUint([]byte{}, num, 10)
    fmt.Println("Base 10:", string(buf10))
    
    // Base 1 (invalid)
    buf1 := strconv.AppendUint([]byte{}, num, 1)
    fmt.Println("Base 1:", string(buf1))
    
    // Base 36 (valid)
    buf36 := strconv.AppendUint([]byte{}, num, 36)
    fmt.Println("Base 36:", string(buf36))
    
    // Base 37 (invalid)
    buf37 := strconv.AppendUint([]byte{}, num, 37)
    fmt.Println("Base 37:", string(buf37))
}

超出 2-36 范围的进制将回退到 10 进制。这确保了函数始终产生有效输出而不会发生 panic。

实际示例:构建 CSV 行

这个实际示例演示了如何使用 AppendUint 来高效地构建包含数字数据的 CSV 行。

csv_builder.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    values := []uint64{100, 200, 300, 400, 500}
    buf := []byte("ID,Value\n")
    
    for i, v := range values {
        buf = strconv.AppendUint(buf, uint64(i+1), 10)
        buf = append(buf, ',')
        buf = strconv.AppendUint(buf, v, 10)
        buf = append(buf, '\n')
    }
    
    fmt.Println(string(buf))
}

我们构建了一个 CSV 头部和几行,包含顺序 ID 和值。AppendUint 在缓冲区中有效地将数字转换为它们的字符串表示。

来源

Go strconv 包文档

本教程通过实际示例介绍了 Go 中的 strconv.AppendUint 函数,以及无符号整数到字节切片的转换。

作者

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

列出所有 Go 教程