ZetCode

Golang strconv.ParseUint

最后修改于 2025 年 4 月 20 日

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

strconv.ParseUint 函数将字符串转换为无符号整数。它支持不同的基数(2 到 36),并将解析后的值作为 uint64 返回。

ParseUint 比 Atoi 更灵活,因为它处理不同的数字基数并确保无符号结果。它返回解析后的值以及无效输入的错误。

基本的 strconv.ParseUint 示例

strconv.ParseUint 最简单的用法是将数字字符串转换为无符号整数。这里我们演示了带错误处理的十进制转换。

basic_parseuint.go
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)转换。

different_bases.go
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 最大值的数字。

large_numbers.go
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 为不同的无效输入返回特定的错误。此示例演示了常见的错误情况。

error_cases.go
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)
    }
}

每个测试用例都显示了一种不同类型的无效输入。错误消息有助于准确识别每次转换失败的原因。

位大小的变化

位大小参数会影响可以解析的值的范围。此示例显示了不同的位大小及其影响。

bit_sizes.go
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 分量。

hex_color.go
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

此示例显示了 ParseUintParseInt 之间的区别,尤其是在处理负数时。

compare_parsers.go
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 包文档

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

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程