Go和int64有什么不同?
我有一个string包含一个整数(已从文件中读取)。
我想使用strconv.ParseInt()
将string
转换为一个int
。 ParseInt
要求我提供bitsize(位大小0,8,16,32和64对应于int,int8,int16,int32和int64)。
从文件读取的整数很小(即它应该适合一个正常的int)。 如果我传递一个0的比特,但是,我得到了一个int64
types的结果(大概是因为我在64位操作系统上运行)。
为什么发生这种情况? 我怎么才能得到一个正常的int? (如果有人快速入门,何时以及为什么我应该使用不同的inttypes,那太棒了!)
编辑:我可以使用int([i64_var])
将int64转换为正常的int。 但我仍然不明白为什么ParseInt()
给我一个int64时,我要求的比特大小为0。
func ParseInt(s string, base int, bitSize int) (i int64, err error)
ParseInt总是返回int64
bitSize
定义值的范围。 如果与s对应的值不能用给定大小的有符号整数表示,则err.Err = ErrRange。
http://golang.org/pkg/strconv/#ParseInt
type int int
int是一个至less有32位大小的有符号整数types。 这是一个独特的types,但是,不是int32的别名。
http://golang.org/pkg/builtin/#int
所以int
将来可能会比32位更大,或者像C中的int
这样的系统。
我猜在一些系统int64
可能会比int32
更快,因为该系统只能使用64位整数。
这是bitSize
为8时的错误示例
http://play.golang.org/p/_osjMqL6Nj
package main import ( "fmt" "strconv" ) func main() { i, err := strconv.ParseInt("123456", 10, 8) fmt.Println(i, err) }
包strconv
func ParseInt
func ParseInt(s string, base int, bitSize int) (i int64, err error)
ParseInt解释给定基础(2到36)中的strings并返回相应的值i。 如果base == 0,则基数由string的前缀隐含:base 16代表“0x”,base 8代表“0”,否则以10为底数。
bitSize参数指定结果必须适合的整数types。 位大小0,8,16,32和64对应于int,int8,int16,int32和int64。
ParseInt返回的错误具有具体types* NumError,并且包含err.Num = s。 如果s为空或包含无效数字,则err.Err = ErrSyntax; 如果与s对应的值不能用给定大小的有符号整数表示,则err.Err = ErrRange。
ParseInt
总是返回一个int64
值。 取决于bitSize
,该值将适合int
, int8
, int16
, int32
或int64
。 如果该值不能由bitSize
给定大小的有符号整数表示,则err.Err = ErrRange
。
Go编程语言规范
数字types
一个n位整数的值是n位宽,用二进制补码表示。
int8 the set of all signed 8-bit integers (-128 to 127) int16 the set of all signed 16-bit integers (-32768 to 32767) int32 the set of all signed 32-bit integers (-2147483648 to 2147483647) int64 the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)
还有一组具有实现特定大小的预定义数字types:
uint either 32 or 64 bits int same size as uint
int
是32或64位,具体取决于实现。 通常32位编译器为32位,64位编译器为64位。
要找出int
或uint
的大小,请使用strconv.IntSize
。
包strconv
常量
const IntSize = intSize
IntSize
是int
或uint
值的大小。
例如,
package main import ( "fmt" "runtime" "strconv" ) func main() { fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS) fmt.Println(strconv.IntSize) }
输出:
gc amd64 linux 64
strconv.ParseInt
和朋友返回64位版本,以保持API清洁和简单。 否则,人们将不得不为每个可能的返回types创build单独的版本。 或者返回interface{}
,然后必须经过一个types断言。 没有一个是理想的。
int64
被选中,因为它可以保持任何整数大小,包括支持的64位。 您传入函数的位大小确保将值正确地钳位到正确的范围。 所以你可以简单地对返回的值进行types转换,把它转换成你需要的任何整数types。
至于int
和int64
之间的区别,这是依赖于体系结构的。 int
只是32位或64位整数的别名,具体取决于您正在编译的架构。
对于挑剔的眼睛:返回的值是一个有符号的整数。 对于无符号整数,有一个单独的strconv.ParseUint
函数,它返回uint64
并遵循如上所述的相同推理。
为了您的目的, strconv.Atoi()
会更方便我想。
其他答案已经非常详尽地解释int
types,但我认为这里有一个指向Go语言规范的链接: http : //golang.org/ref/spec#Numeric_types