ParseInt无法转换为所需的类型

时间:2019-04-30 17:17:48

标签: go

这是我的代码:

软件包主要

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

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

我希望i的长度为8位(strconv.ParseInt的第3个参数)。但是它是int64(并且文档指出strconv.ParseInt将返回int64)。

如果ParseInt总是返回int64(为什么不仅仅使用Atoi?),那又有什么意义呢?

3 个答案:

答案 0 :(得分:3)

请注意该函数的文档:

  

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

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

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

来保证

答案 1 :(得分:2)

  

Package strconv

import "strconv"
     

func ParseInt

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

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

     

如果base == 0,则字符串的前缀隐含基数:base 16 for   “ 0x”,以8为底的“ 0”,否则以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和sign的最大大小整数。


例如,

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

答案 2 :(得分:1)

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

这样可以省去手动检查溢出的麻烦:

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