Golang strconv.ParseInt
最后修改于 2025 年 4 月 20 日
本教程解释了如何在 Go 中使用 strconv.ParseInt
函数。我们将涵盖具有不同基数和位大小的字符串到整数的转换。
strconv.ParseInt
函数将字符串转换为具有指定基数(0 到 36)和位大小(0 到 64)的整数。它比 Atoi 更灵活。
ParseInt 在给定基数下解析字符串,并返回相应的整数值。它返回两个值:解析后的整数和转换失败时的错误。
基本的 strconv.ParseInt 示例
strconv.ParseInt
最简单的用法是将基数为 10 的字符串转换为 64 位整数。这里我们演示了成功的转换和错误处理。
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
可以解析各种基数的数字。此示例显示了十六进制、二进制和八进制数字的转换。
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 会从字符串前缀中检测基数。此示例显示了它如何处理不同的数字格式。
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 参数决定了将保存结果的整数类型。此示例显示了转换为不同位大小的情况。
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 可能因多种原因而失败。此示例演示了不同的错误情况以及如何正确处理它们。
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
的包装器。此示例显示了它们之间的关系以及何时使用它们。
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 颜色值。
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.ParseInt
函数。