Golang strconv.ParseUint
最后修改于 2025 年 4 月 20 日
本教程将介绍如何在 Go 中使用 strconv.ParseUint 函数。我们将通过实际示例涵盖字符串到无符号整数转换的基础知识。
strconv.ParseUint 函数将字符串转换为无符号整数。它支持不同的基数(2 到 36),并将解析后的值作为 uint64 返回。
ParseUint 比 Atoi 更灵活,因为它处理不同的数字基数并确保无符号结果。它返回解析后的值以及无效输入的错误。
基本的 strconv.ParseUint 示例
strconv.ParseUint 最简单的用法是将数字字符串转换为无符号整数。这里我们演示了带错误处理的十进制转换。
package main
import (
"fmt"
"strconv"
)
func main() {
numStr := "42"
num, err := strconv.ParseUint(numStr, 10, 64)
if err != nil {
fmt.Println("Conversion error:", err)
return
}
fmt.Printf("String '%s' converted to uint64 %d\n", numStr, num)
}
我们将字符串 "42" 转换为无符号 64 位整数。我们检查错误以处理无效输入。成功转换后将打印无符号整数值。
处理不同的基数
strconv.ParseUint 可以解析不同基数的数字。此示例显示了十六进制、二进制和八进制(基数 8)转换。
package main
import (
"fmt"
"strconv"
)
func main() {
// Hexadecimal (base 16)
hexNum, _ := strconv.ParseUint("2a", 16, 64)
fmt.Println("Hexadecimal 2a:", hexNum)
// Binary (base 2)
binNum, _ := strconv.ParseUint("1010", 2, 64)
fmt.Println("Binary 1010:", binNum)
// Octal (base 8)
octNum, _ := strconv.ParseUint("755", 8, 64)
fmt.Println("Octal 755:", octNum)
}
通过指定基数参数,我们可以解析不同基数的数字。位大小(64)决定了可以表示的最大值。
处理大数
ParseUint 可以处理非常大的无符号整数。此示例展示了如何解析接近 uint64 最大值的数字。
package main
import (
"fmt"
"strconv"
)
func main() {
maxUint64 := "18446744073709551615"
num, err := strconv.ParseUint(maxUint64, 10, 64)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Max uint64: %d\n", num)
// This will overflow
overflow := "18446744073709551616"
_, err = strconv.ParseUint(overflow, 10, 64)
fmt.Println("Overflow error:", err)
}
我们演示了如何解析 uint64 的最大值,并展示了尝试解析对于 uint64 来说过大的值时会发生什么。
错误处理场景
ParseUint 为不同的无效输入返回特定的错误。此示例演示了常见的错误情况。
package main
import (
"fmt"
"strconv"
)
func main() {
testCases := []struct {
input string
base int
}{
{"-42", 10}, // Negative number
{"12.3", 10}, // Decimal point
{"abc", 10}, // Non-numeric
{"123", 37}, // Invalid base
{"", 10}, // Empty string
}
for _, tc := range testCases {
_, err := strconv.ParseUint(tc.input, tc.base, 64)
fmt.Printf("Input '%s' (base %d): %v\n", tc.input, tc.base, err)
}
}
每个测试用例都显示了一种不同类型的无效输入。错误消息有助于准确识别每次转换失败的原因。
位大小的变化
位大小参数会影响可以解析的值的范围。此示例显示了不同的位大小及其影响。
package main
import (
"fmt"
"strconv"
)
func main() {
numStr := "65535" // Max uint16 value
// 8-bit
u8, _ := strconv.ParseUint(numStr, 10, 8)
fmt.Println("8-bit:", u8) // Will overflow
// 16-bit
u16, _ := strconv.ParseUint(numStr, 10, 16)
fmt.Println("16-bit:", u16)
// 32-bit
u32, _ := strconv.ParseUint(numStr, 10, 32)
fmt.Println("32-bit:", u32)
// 64-bit
u64, _ := strconv.ParseUint(numStr, 10, 64)
fmt.Println("64-bit:", u64)
}
相同的数字字符串根据位大小产生不同的结果。如果数字过大,较小的位大小可能会导致溢出错误。
实用示例:十六进制颜色解析器
此实用示例演示了如何使用 ParseUint 将十六进制颜色代码解析为 RGB 分量。
package main
import (
"fmt"
"strconv"
)
func parseHexColor(color string) (r, g, b uint8, err error) {
if len(color) != 7 || color[0] != '#' {
return 0, 0, 0, fmt.Errorf("invalid color format")
}
// Parse red component
r64, err := strconv.ParseUint(color[1:3], 16, 8)
if err != nil {
return 0, 0, 0, err
}
// Parse green component
g64, err := strconv.ParseUint(color[3:5], 16, 8)
if err != nil {
return 0, 0, 0, err
}
// Parse blue component
b64, err := strconv.ParseUint(color[5:7], 16, 8)
if err != nil {
return 0, 0, 0, err
}
return uint8(r64), uint8(g64), uint8(b64), nil
}
func main() {
color := "#ff00ff"
r, g, b, err := parseHexColor(color)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Color %s: R=%d, G=%d, B=%d\n", color, r, g, b)
}
我们使用 ParseUint 将十六进制颜色字符串解析为其 RGB 分量。每个颜色分量都使用基数 16 和 8 位大小单独解析。
比较 ParseUint 和 ParseInt
此示例显示了 ParseUint 和 ParseInt 之间的区别,尤其是在处理负数时。
package main
import (
"fmt"
"strconv"
)
func main() {
numStr := "-42"
// ParseUint fails with negative numbers
u64, err := strconv.ParseUint(numStr, 10, 64)
if err != nil {
fmt.Println("ParseUint error:", err)
} else {
fmt.Println("ParseUint result:", u64)
}
// ParseInt handles negative numbers
i64, err := strconv.ParseInt(numStr, 10, 64)
if err != nil {
fmt.Println("ParseInt error:", err)
} else {
fmt.Println("ParseInt result:", i64)
}
}
ParseUint 拒绝负数,而 ParseInt 接受负数。这表明应根据输入要求何时使用每个函数。
来源
本教程通过各种场景下字符串到无符号整数转换的实际示例,涵盖了 Go 中的 strconv.ParseUint 函数。