基础数据类型
- 布尔 : bool
- 整型 : int8 , byte , int16 , int , uint , uintptr
- 浮点 : float32 , float64
- 字符串 : string
- 字符类型 : rune
- 复数类型 : complex64 , complex128
- 错误类型 :error
3.1 布尔类型
bool类型在Go语言中可预定义值为true或者false,它不能接受其它类型的赋值,也不能够自动或者强制的类型转换。
3.2 整数类型
整型是所有编程语言里最基础的数据类型。Go语言支持以下这些整型的数据类型
需要注意的是,int 和 int32 在Go语言里被认为是两种不同的数据类型,编译器不会自动做类型转换,比如下面这个例子会导致编译错误:
Go语言支持如下图所示的位运算符:
3.3 浮点类型
Go语言定义了两种浮点类型,float32等价于java语言的float,float64等价于java语言的double类型。与java语言一样,如果浮点型变量没有明确浮点类型以及不加小数点,编译器会将该变量推导为整型而不是浮点型,如果加入了小数点而没有明确浮点类型,编译器会将该变量推导为float64。因为浮点数不是一种精确的表达方式,所以像整型那样直接用==来判断两个浮点数是否相等是不可行的,这可能导致不稳定的结果。下面是一种推荐的替代方案:
3.4 字符串
Go语言中字符串的初始化与赋值非常简单,举例如下:
Go语言支持两种方式遍历字符串,一种诗意字节数组的方式遍历,一种是Unicode字符遍历,如下图所示:
注意:在Go语言中,每个中文字符在UTF-8中占3个字节,而不是一个字节。以Unicode字符方式遍历时,每个字符的类型是rune,而不是byte。
3.5 字符类型
在Go语言中支持两个字符类型,一个是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一个是rune,代表单个Unicode。下面的例子展示了整型,字符串之间的相互转化。
3.6 复数类型
复数实际上有两个实数构成,一个表示实部(real),一个表示虚部(imag)。对于一个复数 Z = complex(x , y) , 就可以通过Go语言内置函数real(z) 获得该复数的实部,也就是x , 通过imag(z) 获得该复数的虚部,也就是y 。 复数表示的示例如下 :
3.7 错误类型
Go语言引入了一个关于错误处理的标准模式,即error接口。对于大多数函数,如果要返回错误,大致可以定义为如下模式,将error作为多种返回值中的最后一个,但这并非强制性要求。如下图所示:
下面用Go库中的实际代码来示范如何使用自定义的error类型。
复合数据类型
- 数组 : array
- 切片 : slice
- 字典 : map
- 指针: pointer
- 通道 : chan
- 接口 : interface
- 结构体 : struct
3.8 数组
数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element) , 一个数组包含的元素个数被称为数组的长度。在Go语言中,数组长度在定义以后就不可以更改,在声明长度时可以为一个常量或者一个常量表达式(常量表达式是指在编译期间即可计算结果的表达式)。数组的长度是该数组类型的一个内置常量,可以用Go语言的内置函数len()来获取。
Go语言中,对数组的访问,可以直接使用数组下标的访问数组中的元素。数组下标与Java语言相似,都是从0开始。len(array) - 1 则表示最后一个数组下标。
需要特别注意的是,在Go语言中数组是一个值类型。所有的值类型变量在赋值和作为参数传递时都将产生一次复制动作。如果将数组作为函数的参数类型,则在函数调用时该参数将发生复制。因此,在函数体中无法修改传入数组的内容,因为函数内操作的只是所传数组的一个副本。下面的额例子来说明这一特点:
3.9 切片
数组的长度,在定义以后无法修改;数组是值类型,每次传递都将产生一个副本,这种数据结构无法满足开发者的真实需求,在这样的背景下,数组切片应运而生了,它弥补了当前数组的不足。初看起来,数组切片(slice)就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针。数组切片的数据结构可以抽象为以下3个变量:
- 一个指向原生数组的指针
- 数组切片中的元素个数
- 数组切片已分配的存储空间
基于数组,数组切片添加了一系列管理功能,可以随时动态扩充存放空间,并且可以随时传递而不会导致所管理的元素被重复复制。 创建数组切片的方法主要有两种:基于数组和直接创建。数组切片可以基于一个已存在的数组创建,甚至可以创建一个比所基于的数组还要大的数组切片。
并非一定要事先准备好一个数组才能够创建数组切片。Go语言提供的内置函数mark()可以用于灵活的创建数组切片。如下图所示:
与数组相比,数组切片多了一个存储能力(Capacity)的概念,即元素个数和分配的空间可以是两个不同的值。合理的设置存储能力的值,可以大幅降低数组切片内部分配内存和搬送内存块的频率,从而大大提高程序性能。假如已知某元素的存储个数为50,如果设置的存储能力小于50,比如20,那么,在元素超出20时,底层将会至少发生一次这样的动作:重新分配一块“够大”的内存,并且需要把原来的内存块复制到新的内存块中,这会产生很多明显的开销。如果,重新分配的空间还是不够大,那么程序又会重复执行一次。如果,我们在一开始就设置存储能力为50,那么,以后就不会发生这样非常消耗CPU的动作,从而达到空间换时间的效果。
3.10 map
map是一堆键值对未排序的集合。在Go语言中,使用map不需要引入任何库,而且使用起来也更加方便。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于