Golang strconv.AppendInt
最后修改于 2025 年 4 月 20 日
本教程将解释如何在 Go 中使用 strconv.AppendInt 函数。我们将通过实际示例涵盖整数到字节切片的转换。
strconv.AppendInt 函数将整数的字符串表示形式附加到字节切片。它对于使用数字构建字节缓冲区非常有效。
当您需要构造包含数值的字节切片时,AppendInt 非常有用。与字符串转换相比,它可以避免临时的字符串分配。
基本的 strconv.AppendInt 示例
strconv.AppendInt 最简单的用法是将整数附加到字节切片。该函数返回带有数字字符串形式的扩展切片。
package main
import (
"fmt"
"strconv"
)
func main() {
buf := []byte("Number: ")
buf = strconv.AppendInt(buf, 42, 10)
fmt.Println(string(buf))
}
我们从包含“Number: ”的字节切片开始。AppendInt 将“42”附加到其中。base 参数(10)指定十进制表示。结果将打印出来。
附加到空切片
strconv.AppendInt 可与空切片一起使用。此示例演示了如何从头开始使用多个整数值构建字节切片。
package main
import (
"fmt"
"strconv"
)
func main() {
var buf []byte
buf = strconv.AppendInt(buf, 10, 10)
buf = append(buf, ' ')
buf = strconv.AppendInt(buf, 20, 10)
buf = append(buf, ' ')
buf = strconv.AppendInt(buf, 30, 10)
fmt.Println(string(buf))
}
我们初始化一个空的字节切片,并附加三个数字,数字之间用空格隔开。每次 AppendInt 调用都会返回一个新切片,我们将其重新分配给 buf。结果是“10 20 30”。
不同的数字基数
base 参数控制数字表示。本示例演示了转换为二进制、八进制、十进制和十六进制格式。
package main
import (
"fmt"
"strconv"
)
func main() {
buf := []byte("Bases: ")
buf = strconv.AppendInt(buf, 42, 2) // binary
buf = append(buf, ' ')
buf = strconv.AppendInt(buf, 42, 8) // octal
buf = append(buf, ' ')
buf = strconv.AppendInt(buf, 42, 10) // decimal
buf = append(buf, ' ')
buf = strconv.AppendInt(buf, 42, 16) // hexadecimal
fmt.Println(string(buf))
}
我们以四种不同的基数附加数字 42。base 必须在 2 到 36 之间。对于大于 10 的基数,对于大于等于 10 的数字,将使用小写字母 a-z。
负数
strconv.AppendInt 正确处理负整数。此示例显示了负值如何在输出中格式化。
package main
import (
"fmt"
"strconv"
)
func main() {
buf := []byte("Temperatures: ")
buf = strconv.AppendInt(buf, -10, 10)
buf = append(buf, '°', ' ')
buf = strconv.AppendInt(buf, 0, 10)
buf = append(buf, '°', ' ')
buf = strconv.AppendInt(buf, 25, 10)
buf = append(buf, '°')
fmt.Println(string(buf))
}
负数前会加上一个负号。我们还演示了如何在同一个切片中将非数字字节(° 符号)与数字值一起附加。
构建 CSV 行
这个实际示例展示了如何使用 strconv.AppendInt 构建包含整数值的 CSV 行,以实现高效的字符串构建。
package main
import (
"fmt"
"strconv"
)
func main() {
values := []int64{100, 200, 300, 400, 500}
buf := []byte("ID,Value\n")
for i, v := range values {
buf = strconv.AppendInt(buf, int64(i+1), 10)
buf = append(buf, ',')
buf = strconv.AppendInt(buf, v, 10)
buf = append(buf, '\n')
}
fmt.Println(string(buf))
}
我们构建了一个 CSV 头部和包含顺序 ID 和值的行。AppendInt 用于 ID 计数器和值。这避免了字符串转换。
性能比较
本示例将 strconv.AppendInt 与字符串连接进行比较,以构建包含数字的字符串,从而显示其性能优势。
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func appendIntMethod(n int) string {
buf := []byte{}
for i := 0; i < n; i++ {
buf = strconv.AppendInt(buf, int64(i), 10)
buf = append(buf, ' ')
}
return string(buf)
}
func stringConcatMethod(n int) string {
var s string
for i := 0; i < n; i++ {
s += strconv.Itoa(i) + " "
}
return s
}
func main() {
const count = 10000
start := time.Now()
appendIntMethod(count)
fmt.Println("AppendInt duration:", time.Since(start))
start = time.Now()
stringConcatMethod(count)
fmt.Println("String concat duration:", time.Since(start))
}
AppendInt 在构建包含数字的大型字符串时速度明显更快,因为它避免了临时的字符串分配。差异会随着输入增大而增大。
自定义数字格式
这个高级示例演示了如何使用 strconv.AppendInt 构建带有千位分隔符的自定义数字格式。
package main
import (
"fmt"
"strconv"
)
func formatWithCommas(n int64) string {
if n == 0 {
return "0"
}
var buf []byte
negative := n < 0
if negative {
n = -n
}
for i := 0; n > 0; i++ {
if i > 0 && i%3 == 0 {
buf = append([]byte{','}, buf...)
}
digit := byte('0' + n%10)
buf = append([]byte{digit}, buf...)
n /= 10
}
if negative {
buf = append([]byte{'-'}, buf...)
}
return string(buf)
}
func main() {
fmt.Println(formatWithCommas(0))
fmt.Println(formatWithCommas(42))
fmt.Println(formatWithCommas(1234))
fmt.Println(formatWithCommas(987654321))
fmt.Println(formatWithCommas(-12345678))
}
我们从右到左逐个数字构建数字字符串,每三个数字插入一个逗号。这表明了类似 AppendInt 的逻辑如何进行自定义。
来源
本教程通过 Go 中 strconv.AppendInt 函数的实际示例,涵盖了高效的整数到字节切片转换。