美文网首页
「Go」ParseInt

「Go」ParseInt

作者: 叨码 | 来源:发表于2020-06-01 11:34 被阅读0次

    本系列文章由刀码旦编写,转载请注明出处

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

    参数概述

    返回字符串表示的整数值,接受正负号。
    base指定进制(2到36),如果base为0,则会从字符串前置判断,"0x"是16进制,"0"是8进制,否则是10进制;
    bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64;返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange。

    起初我的理解,以为bitSize参数指定的是需要返回的int类型,比如int8 、int16、int32、int64。你指定什么就返回什么类型的int,只要不溢出。
    但是通过代码实践却发现不是这么回事

    var str1 string = "12"
    var n1 int8
    n1 ,_ = strconv.ParseInt(str1,10,8)
    

    会有错误提示

    Cannot assign int64 to n1 (type int8) in multiple assignment
    同理你指定其他类型也同样报错。
    只有你指定n1 为int64才正确

    var str1 string = "1234"
    var n1 int64
    n1 ,_ = strconv.ParseInt(str1,10,8)
    fmt.Printf("n1 type %T,n1=%v",n1,n1)
    

    结果输出

    n1 type int64,n1=127
    

    不管你传入的bitSize是(0、8、16、32、64)中哪一个,结果类型都是int64。
    也就是说明,parseInt函数的返回值就是int64的,不是bitSize来决定的

    那bitSize到底什么作用呢,其实bitSize可认为实际上做了校验的功能,比如下面的代码会报错

    var str1 string = "1234"
     n1, err := strconv.ParseInt(str1, 10, 8)
     fmt.Println(n1) // 此时tmp = 127
     if err != nil {
          log.Fatal(err)  // strconv.ParseInt: parsing "1234": value out of range
     }
    

    那是因为int8范围为[-128~127]

    如果你需要得到其他类型的返回值可以这样干,强制将int64转换成你需要的类型

    var n1 int64
    n1, _ = strconv.ParseInt("123", 10, 0)
    numInt := int(n1)
    numUint := uint(n1)
    numInt32 := int32(n1)
    fmt.Println(numInt, numUint, numInt32)
    

    综上所述,由于go语言是强类型的特性,所以第一个返回值必须是int64类型,因此你的num也必须是int64类型,不管你要转换成什么都必须把num声明成int64,当你知道要转换字符串是在某个范围内,那就把bitSize填成对应位即可,这样转换时也会检查是否越界

    相关文章

      网友评论

          本文标题:「Go」ParseInt

          本文链接:https://www.haomeiwen.com/subject/kcujzhtx.html