关于srtconv.parselnt的问题

yuwei · 2019-06-06 01:05:17 · 3618 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-06-06 01:05:17 的主题,其中的信息可能已经有所发展或是发生改变。

在使用strconv.parselnt时,如果返回值是赋值给一个int变量,那么参数中的bitSize填0的话,会报错。必须把之前的变量声明为确定位数的整型(int8、int16、int32、int64),还要填入对应的数值(int8对应8,int16对应16)。 但是像这样 fmt.Println(strconv.ParseInt(字符串, 10, 0)) 直接在另一个函数内调用的却可以填入0,谁能帮忙解释一下。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3618 次点击  
加入收藏 微博
8 回复  |  直到 2019-06-09 16:15:22
eric160
eric160 · #1 · 6年之前

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

你最好贴一下你你的代码,这样好判断。 估计你的错误是这样:

a:=strconv.ParseInt(字符串,10,0)

因为ParseInt有两个返回值,你只赋值了一个,所以编译会报错。应该这样:

a,_:=strconv.ParseInt(字符串,10,0)

像这样fmt.Println(strconv.ParseInt(字符串, 10, 0))不会报错,是因为你打打印出了两个值,你可以看一下你最后的输出,是不是有两个:

数值 <nil>

yuwei
yuwei · #2 · 6年之前

1楼 @eric160 package main

import ( "fmt" "strconv" )

func main() {

var str = "2942394"
//var num int

//num, _ = strconv.ParseInt(str, 10, 0)

//fmt.Println(num)
fmt.Println(strconv.ParseInt(str, 10, 0))

} 这是代码。 已经是忽略了error的值了的,可是还是会报错 ./hello.go:13:9: cannot assign int64 to num (type int) in multiple assignment

深度截图_选择区域_20190606173841.png

jan-bar
jan-bar · #3 · 6年之前

strconv.ParseInt本来返回第一个参数就是int64类型啊

var n int64
n, _ = strconv.ParseInt("2942394", 10, 0)
fmt.Println(n)


n, _ := strconv.ParseInt("2942394", 10, 0)
fmt.Println(n)

上面2中用法没毛病

yuwei
yuwei · #4 · 6年之前
jan-barjan-bar #3 回复

strconv.ParseInt本来返回第一个参数就是int64类型啊 ``` var n int64 n, _ = strconv.ParseInt("2942394", 10, 0) fmt.Println(n) n, _ := strconv.ParseInt("2942394", 10, 0) fmt.Println(n) ``` 上面2中用法没毛病

那就是说只有在声明n的时候定义n是int64时,才能在参数中直接填0,而且还要求系统是64位的才行。 可是strconv.ParseInt的说明中写0值对应int,n定义为int时,就会报错。这样的话,我就不太理解为什么会这样了

jan-bar
jan-bar · #5 · 6年之前
yuweiyuwei #4 回复

#3楼 @jan-bar 那就是说只有在声明n的时候定义n是int64时,才能在参数中直接填0,而且还要求系统是64位的才行。 可是strconv.ParseInt的说明中写0值对应int,n定义为int时,就会报错。这样的话,我就不太理解为什么会这样了

这个和填0没什么关系。。该方法返回值就是int64啊。所以要用int64的变量接收。可以看看源码,里面有说明额。

yuwei
yuwei · #6 · 6年之前
jan-barjan-bar #5 回复

#4楼 @yuwei 这个和填0没什么关系。。该方法返回值就是int64啊。所以要用int64的变量接收。可以看看源码,里面有说明额。

谢谢你的解答。目前我看源码还是有些困难。 在我的代码中 var str = "29" var num int32

num, _ = strconv.ParseInt(str, 10, 32)

num是int32,参数中也是32,可是依然报错 image.png 如果num定义为int64,那么参数中填入0或64都是没有问题的。 这样看来,并不像文档中所说0对应int,8对应int8,32对应int32。而是默认int64。 那么在fmt.Println(strconv.ParseInt(str, 10, 0))这个语句中没有出现问题,只能是Println函数接收的值也是int64,。 可是go是根据系统是32位还是64位来确定int型是几位的。那这样的情况下,把变量声明为int,编译不过的问题不就会特别多?go语言的设计者不应该想不到这样的问题呀,所以我认为是我理解错了,只是找不到原因

jan-bar
jan-bar · #7 · 6年之前
func ParseInt(s string, base int, bitSize int) (i int64, err error) 
由于go语言是强类型的特性,所以第一个返回值必须是int64类型,因此你的num也必须是int64类型,
不管你要转换成什么都必须把num声明成int64

但是如果你需要得到其他类型的返回值可以这样干,强制将int64转换成你需要的类型
    var tmp int64
    tmp, _ = strconv.ParseInt("123", 10, 0)
    numInt := int(tmp)
    numUint := uint(tmp)
    numInt32 := int32(tmp)
    fmt.Println(numInt, numUint, numInt32)

第3个参数bitSize实际上做了校验的功能,比如下面的代码会报错
    tmp, err := strconv.ParseInt("123456", 10, 8)
    fmt.Println(tmp) // 此时tmp = 127
    if err != nil {
        log.Fatal(err)  // strconv.ParseInt: parsing "123456": value out of range
    }
那是因为int8范围为[-128~127]

综上所述,当你知道要转换字符串是在某个范围内,那就把bitSize填成对应位即可,
这样转换时也会检查是否越界。

多说一点关于:strconv.ParseUint
这个转换结果必须是uint64,因此只能转换正整数,如果传入字符串为负数那也会报错的。
yuwei
yuwei · #8 · 6年之前

@jan-bar 看了你的回答我才弄懂,谢谢谢谢。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传