【问题标题】:ParseInt doesn't convert to the desired typeParseInt 不会转换为所需的类型
【发布时间】:2019-09-19 09:47:47
【问题描述】:

这是我的代码:

主包

import (
    "fmt"
    "reflect"
    "strconv"
)

func main() {
   i, _ := strconv.ParseInt("10", 10, 8)
   fmt.Println(reflect.TypeOf(i))
}

我希望i 的长度为 8 位(strconv.ParseInt 的第三个参数)。然而,它是 int64(文档指出 strconv.ParseInt 将返回 int64)。

如果 ParseInt 总是返回 int64 有什么意义(为什么不直接使用 Atoi?)

【问题讨论】:

    标签: go


    【解决方案1】:

    请从函数的文档中注意这一点:

    bitSize 参数指定结果必须是整数类型 适合。位大小 0、8、16、32 和 64 对应于 int、int8、 int16、int32 和 int64。对于低于 0 或高于 64 的 bitSize,错误是 返回。

    因此保证您可以使用byte(i) 将结果转换为字节。

    Go 还没有泛型,因此很难有一个可以接受指向多个整数类型的指针的ParseInt。相反,保证是通过 bitSize 参数完成的

    【讨论】:

      【解决方案2】:

      Package strconv

      import "strconv"
      

      func ParseInt

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

      ParseInt 解释给定基数(0、2 到 36)和位的字符串 s size(0到64)并返回对应的值i。

      如果 base == 0,则字符串前缀暗示了 base:base 16 for “0x”,“0”以 8 为基数,否则以 10 为基数。对于基数 1,低于 0 或 36以上返回错误。

      bitSize 参数指定结果必须是整数类型 适合。位大小 0、8、16、32 和 64 对应于 int、int8、 int16、int32 和 int64。对于低于 0 或高于 64 的 bitSize,错误是 返回。

      ParseInt 返回的错误具有具体类型 *NumError 和 包括 err.Num = s。如果 s 为空或包含无效数字,则 err.Err = ErrSyntax,返回值为0;如果对应于 s 的值不能用给定大小的有符号整数表示,则 err.Err = ErrRange,返回值是相应bitSize和符号的最大幅度整数。


      例如,

      package main
      
      import (
          "fmt"
          "strconv"
      )
      
      func main() {
          i64, err := strconv.ParseInt("10", 10, 8)
          if err != nil {
              panic(err)
          }
          fmt.Printf("%[1]d %[1]T\n", i64)
          i8 := int8(i64)
          fmt.Printf("%[1]d %[1]T\n", i8)
      
      }
      

      游乐场:https://play.golang.org/p/HSHtUnC7qql

      输出:

      10 int64
      10 int8
      

      在 Go 中,我们经常使用函数来隐藏实现细节。

      例如,

      package main
      
      import (
          "fmt"
          "strconv"
      )
      
      func ParseInt8(s string, base int) (int8, error) {
          i64, err := strconv.ParseInt(s, base, 8)
          return int8(i64), err
      }
      
      func main() {
          i8, err := ParseInt8("10", 10)
          if err != nil {
              panic(err)
          }
          fmt.Printf("%[1]d %[1]T\n", i8)
      
      }
      

      游乐场:https://play.golang.org/p/HdA3O71U54z

      输出:

      10 int8
      

      【讨论】:

        【解决方案3】:

        我认为您真正要问的是 ParseInt() 的第三个参数有什么意义。

        这是为了让您不必像这样手动检查溢出:

        i, err := strconv.Atoi(intString)
        if err != nil || i < -128 || i > 127 {
          // handle error
        }
        i8 := int8(i)
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-26
          • 2021-09-02
          • 2016-07-03
          • 2017-05-20
          • 2020-07-02
          • 1970-01-01
          相关资源
          最近更新 更多