整型
我们经常看到这样的变量声明:
var (
a int
b string
c float32
)
在Go中所有变量都是有类型的, 比如前面的int, string, float32 这些, 因此在接下来我们将先讲解下Go的基础类型
go在语言成面定义了如下几种基础类型:
- 整形 12345
- 浮点型 123.45
- 复数 123.45i
- 字符 'a'
- 字符串 "abc"
- 布尔类型 true, false
- 枚举类型 iota
- 自定义类型
Go语言的数值类型包括几种不同大小的整形数、浮点数和复数。让我们先从整形数类型开始介绍。
Go语言同时提供了有符号和无符号类型的整数运算。 这里有int8、int16、int32和int64四种截然不同大小的有符号整形数类型,分别对应8、16、32、64bit大小的有符号整形数,与此对应的是uint8、 uint16、uint32和uint64四种无符号整形数类型。
这里还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint;其中int是应用最广泛的数值类型。这两种类型都有同样的大小,32或64bit,但是我们不能对此做任何的假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。
Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。这两个名称可以互换使 用。同样byte也是uint8类型的等价类型,byte类型一般用于强调数值是一个原始的数据而不是一个小的整数。
最后,还有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。uintptr类型只有在底层编程是才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。我们将在第十三章 的unsafe包相关部分看到类似的例子。
不管它们的具体大小,int、uint和uintptr是不同类型的兄弟类型。 其中int和int32也是不同的类型,
即使int的大小也是32bit,在需要将int当作int32类型的地方需要一个显式的类型转换操作 ,反之亦
然。
一般来说,需要一个显式的转换将一个值从一种类型转化位另一种类型,并且算术和逻辑运算的二元操作中必须是相同的类型。虽然这偶尔会导致需要很长的表达式,但是它消除了所有和类型相关的问题,而且也使得程序容易理解。
在很多场景,会遇到类似下面的代码通用的错误:
当尝试编译这三个语句时,将产生一个错误信息:
这种类型不匹配的问题可以有几种不同的方法修复,最常见方法是将它们都显式转型为一个常见类型:
对于每种类型T,如果转换允许的话,类型转换操作T(x)将x转换为T类型。许多整形数之间的相互转换并不会改变数值;它们只是告诉编译器如何解释这个值。但是对于将一个大尺寸的整数类型转为一个小尺寸的整数类型,或者是将一个浮点数转为整数,可能会改变数值或丢失精度:
浮点数到整数的转换将丢失任何小数部分,然后向数轴零方向截断。