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
函数。