ZetCode

Golang strconv.ParseInt

最后修改于 2025 年 4 月 20 日

本教程解释了如何在 Go 中使用 strconv.ParseInt 函数。我们将涵盖具有不同基数和位大小的字符串到整数的转换。

strconv.ParseInt 函数将字符串转换为具有指定基数(0 到 36)和位大小(0 到 64)的整数。它比 Atoi 更灵活。

ParseInt 在给定基数下解析字符串,并返回相应的整数值。它返回两个值:解析后的整数和转换失败时的错误。

基本的 strconv.ParseInt 示例

strconv.ParseInt 最简单的用法是将基数为 10 的字符串转换为 64 位整数。这里我们演示了成功的转换和错误处理。

basic_parseint.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    numStr := "42"
    
    num, err := strconv.ParseInt(numStr, 10, 64)
    if err != nil {
        fmt.Println("Conversion error:", err)
        return
    }
    
    fmt.Printf("String '%s' converted to integer %d\n", numStr, num)
}

我们使用基数 10 将字符串 "42" 转换为 64 位整数。检查错误以处理转换失败的情况。成功的转换将打印整数值。

处理不同的基数

strconv.ParseInt 可以解析各种基数的数字。此示例显示了十六进制、二进制和八进制数字的转换。

different_bases.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // Hexadecimal (base 16)
    hexNum, _ := strconv.ParseInt("2a", 16, 64)
    fmt.Println("Hexadecimal 2a:", hexNum)
    
    // Binary (base 2)
    binNum, _ := strconv.ParseInt("1010", 2, 64)
    fmt.Println("Binary 1010:", binNum)
    
    // Octal (base 8)
    octNum, _ := strconv.ParseInt("12", 8, 64)
    fmt.Println("Octal 12:", octNum)
}

我们演示了在基数 16(十六进制)、基数 2(二进制)和基数 8(八进制)下解析数字。当给出正确的基数时,该函数可以正确处理所有这些情况。

自动基数检测

当指定基数 0 时,ParseInt 会从字符串前缀中检测基数。此示例显示了它如何处理不同的数字格式。

auto_base.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // Detects base from prefix
    decNum, _ := strconv.ParseInt("42", 0, 64)
    hexNum, _ := strconv.ParseInt("0x2a", 0, 64)
    octNum, _ := strconv.ParseInt("052", 0, 64)
    
    fmt.Println("Decimal 42:", decNum)
    fmt.Println("Hexadecimal 0x2a:", hexNum)
    fmt.Println("Octal 052:", octNum)
}

使用基数 0,该函数将 0x 前缀识别为十六进制,将 0 前缀识别为八进制。没有前缀则表示基数 10。这提供了灵活的输入处理。

处理不同的位大小

bitSize 参数决定了将保存结果的整数类型。此示例显示了转换为不同位大小的情况。

bit_sizes.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 8-bit integer
    num8, _ := strconv.ParseInt("127", 10, 8)
    fmt.Printf("8-bit: %d (type: %T)\n", num8, num8)
    
    // 16-bit integer
    num16, _ := strconv.ParseInt("32767", 10, 16)
    fmt.Printf("16-bit: %d (type: %T)\n", num16, num16)
    
    // 32-bit integer
    num32, _ := strconv.ParseInt("2147483647", 10, 32)
    fmt.Printf("32-bit: %d (type: %T)\n", num32, num32)
    
    // 64-bit integer
    num64, _ := strconv.ParseInt("9223372036854775807", 10, 64)
    fmt.Printf("64-bit: %d (type: %T)\n", num64, num64)
}

bitSize 参数会影响返回类型。超出指定大小的值将返回错误。尽管 bitSize 不同,但实际类型始终是 int64。

错误处理场景

ParseInt 可能因多种原因而失败。此示例演示了不同的错误情况以及如何正确处理它们。

error_cases.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    testCases := []struct {
        input string
        base  int
        bits  int
    }{
        {"123", 10, 64},
        {"12.3", 10, 64},
        {"abc", 10, 64},
        {"123abc", 10, 64},
        {"", 10, 64},
        {"7fffffffffffffff", 16, 32},
    }
    
    for _, tc := range testCases {
        _, err := strconv.ParseInt(tc.input, tc.base, tc.bits)
        if err != nil {
            fmt.Printf("Error parsing '%s' (base %d, bits %d): %v\n",
                tc.input, tc.base, tc.bits, err)
        }
    }
}

我们测试了各种错误场景,包括无效字符、空字符串和溢出条件。每个错误都会提供有关失败的具体信息。

比较 ParseInt 和 Atoi

strconv.Atoi 实际上是 ParseInt 的包装器。此示例显示了它们之间的关系以及何时使用它们。

atoi_comparison.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    numStr := "42"
    
    // Using Atoi
    num1, err1 := strconv.Atoi(numStr)
    if err1 != nil {
        fmt.Println("Atoi error:", err1)
    } else {
        fmt.Println("Atoi result:", num1)
    }
    
    // Equivalent ParseInt call
    num2, err2 := strconv.ParseInt(numStr, 10, 0)
    if err2 != nil {
        fmt.Println("ParseInt error:", err2)
    } else {
        fmt.Println("ParseInt result:", num2)
    }
}

对于基数 10 的转换,Atoi 更简单,而 ParseInt 提供了更多的控制。对于有效的基数 10 输入,它们产生相同的结果。

实际示例:十六进制颜色解析器

这个实际示例演示了如何使用 ParseInt 从十六进制字符串解析 RGB 颜色值。

hex_color.go
package main

import (
    "fmt"
    "strconv"
)

func parseHexColor(color string) (r, g, b int, err error) {
    if len(color) != 7 || color[0] != '#' {
        return 0, 0, 0, fmt.Errorf("invalid color format")
    }
    
    // Parse red component
    r64, err := strconv.ParseInt(color[1:3], 16, 64)
    if err != nil {
        return 0, 0, 0, err
    }
    
    // Parse green component
    g64, err := strconv.ParseInt(color[3:5], 16, 64)
    if err != nil {
        return 0, 0, 0, err
    }
    
    // Parse blue component
    b64, err := strconv.ParseInt(color[5:7], 16, 64)
    if err != nil {
        return 0, 0, 0, err
    }
    
    return int(r64), int(g64), int(b64), nil
}

func main() {
    color := "#ff00cc"
    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)
}

我们将十六进制颜色字符串解析为其 RGB 分量。每个颜色通道被提取为子字符串,并使用基数 16 进行解析。

来源

Go strconv 包文档

本教程通过各种场景下的字符串到整数转换的实际示例,介绍了 Go 中的 strconv.ParseInt 函数。

作者

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

列出所有 Go 教程