Golang中strconv.parseInt()为何永远不会返回int类型

Golang中strconv.parseInt()为何永远不会返回int类型 大家好!

关于使用 strconv 包进行 stringint 转换的问题。

首先,strconv.Atoi() 返回类型 int。 其次,看起来 strconv.ParseInt() 从不返回类型 int。然而,语言定义中写道:

“bitSize 参数指定结果必须适合的整数类型。位大小 0、8、16、32 和 64 分别对应 int、int8、int16、int32 和 int64。”

所以,如果我这样做:

n, _ := strconv.ParseInt("42", 10, 0)

n 应该是一个 int,而不是 int64。对吗?但是,它是 int64

在有人告诉我“如何获得 32/64 位 int”之前:我引用的是语言规范,而编译器并不符合上面引用的描述。

有什么想法吗?

谢谢。


更多关于Golang中strconv.parseInt()为何永远不会返回int类型的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

是的!!!现在明白了!

谢谢。

Deepak。

更多关于Golang中strconv.parseInt()为何永远不会返回int类型的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go语言没有泛型类型或泛型函数——不存在泛型的 ParseInt(因为泛型版本会有不同的返回类型)。

bitSize 参数指定结果必须适配的整数类型。位大小 0、8、16、32 和 64 分别对应 int、int8、int16、int32 和 int64。

这段引用并没有说函数返回 int8、int16、int32……;它只是说结果适配 bitSize。而唯一能适配所有这些类型的整数是 int64。

函数签名为:

func ParseInt(s string, base int, bitSize int) (i int64, err error)

它固定返回 int64,因为 int64 可以容纳所有其他整数类型。

这是一个很好的观察。实际上,strconv.ParseInt() 确实永远不会返回 int 类型,它总是返回 int64,无论 bitSize 参数是什么。

根据 Go 语言规范,ParseInt 的函数签名是:

func ParseInt(s string, base int, bitSize int) (i int64, err error)

返回值类型明确是 int64bitSize 参数的作用是限制解析值的范围,而不是改变返回类型。如果解析的值超出了指定 bitSize 的范围,函数会返回错误。

示例代码:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 总是返回 int64
    n1, _ := strconv.ParseInt("42", 10, 0)   // bitSize=0,对应 int 范围
    n2, _ := strconv.ParseInt("42", 10, 32)  // bitSize=32,对应 int32 范围
    n3, _ := strconv.ParseInt("42", 10, 64)  // bitSize=64,对应 int64 范围
    
    fmt.Printf("n1 type: %T, value: %v\n", n1, n1)  // int64
    fmt.Printf("n2 type: %T, value: %v\n", n2, n2)  // int64
    fmt.Printf("n3 type: %T, value: %v\n", n3, n3)  // int64
    
    // 验证范围限制
    _, err := strconv.ParseInt("9999999999", 10, 32)
    fmt.Println("ParseInt with overflow:", err)  // 超出 int32 范围
    
    // 如果需要 int 类型,使用 Atoi 或类型转换
    n4, _ := strconv.Atoi("42")
    fmt.Printf("n4 type: %T, value: %v\n", n4, n4)  // int
    
    // 或者将 int64 转换为 int
    n5 := int(n1)
    fmt.Printf("n5 type: %T, value: %v\n", n5, n5)  // int
}

文档中关于 bitSize 的描述是指值的有效范围,而不是返回类型。bitSize=0 意味着值应该在当前平台的 int 类型范围内(32位或64位),但返回值仍然是 int64

如果你需要 int 类型,有两个选择:

  1. 使用 strconv.Atoi() - 它直接返回 int
  2. 使用 strconv.ParseInt() 然后进行类型转换:int(n)

这种设计可能是为了保持 API 的简洁性,避免为不同的整数类型创建多个函数版本。

回到顶部