1 概述
Go语言作为类C语言,支持常规的基础数据类型的的同时,支持常用的高级数据类型。他们是:
整数,int,uint,int8,uint8,int16,uint16,int32,uint32,int64,uint64
浮点(小数),float32,float64
复数,complex
字符,byte,rune
字符串,string
布尔,bool
指针,pointor
数组,array
nil
切片,slice。(引用类型)
映射,map
结构体,stuct
接口,interface
通道,channel
函数,func()
2 整数
支持的整型分类很细,主要差异是占用的存储空间不同。基于有无符号列出为:
有符号的:int,int8,int16,int32,int64
无符号的:uint,uint8,uint16,uint32,uint64
其中int, unit是基于处理器架构的。意味着会根据处理器来确定是32bit还是64bit。
使用时,常常使用int。或者使用int32保证兼容。
在类型推导时,推导的整型为int,其他长度整型需要在定义变量时强制声明。
示例:
整型的默认值为0。
3 浮点数
支持IEEE-754标准浮点数。支持32bit和64bit的浮点数float32和float64。
在类型推导时,推导的浮点型为float64。float32需要在定义变量时强制声明。
示例:
浮点数的默认值为0。
4 复数
原生支持复数。
支持32bit+32bit复数complex64,和64bit+64bit的复数complex128。
5 字符
使用单引号定义字符型数据,字符指的是单个字符。有两种byte和rune:
byte:单字节字符,是uint8的别名。用于存储ASCII字符集字符
rune:多字节字符,是int32的别名。用于存储unicode字符集字符。
在类型推导时,推导的字符型为rune。byte需要在定义变量时强制声明。
示例:
字符的默认值是0。字符的本质就是整数型,根据字符集得到对应的字符。
6 字符串
原生支持字符串。使用双引号(“”)或反引号(``)定义,内部是unicode编码。
双引号:””, 用于单行字符串。
反引号:``,用于定义多行字符串,内部会原样解析。
示例:
字符串支持转义字符,列表如下:
转移符 含 义
\r 回车符(返回行首)
\n 换行符(直接跳到下一行的同列位置)
\t 制表符
\’ 单引号
\” 双引号
\ 反斜杠
\uXXXX Unicode字符码值转义
7 布尔型
布尔型的值只可以是常量 true 或者 false。
示例:
8 指针
指针类型用于存储变量地址。使用运算符&,完成操作。
使用运算符p:=&v可以获取v变量的地址。p中的数据格式类似,是一个内存地址的16进制表示。
使用运算符p可以获取指针p指向变量v的值。
如图所示:
在Go语言中,指针主要用于:
类型指针,对指针指向的数据进行修改。函数调用时传递参数使用指针,避免值传递拷贝额外数据。注意类型指针不能进行偏移和运算。
切片,由指向起始元素的原始指针、元素数量和容量组成。
示例:
9 数组
数组是一段固定长度的连续内存区域。是具有相同类型数据元素序列。元素类型支持任意内置类型。
数组从声明时就确定长度,可以修改数组元素,但是数组不可修改长度。
使用 进行数组的声明。
示例:
会使用类型默认值初始化元素。
数组不是引用类型,变量间为值传递。
可以使用range配合循环结构完成遍历,示例如下:
10 nil
nil,可以理解为未初始化引用。是以下类型的默认初始值:
pointers -> nil
slices -> nil
maps -> nil
channels -> nil
functions -> nil
interfaces -> nil
11 切片
切片是一个拥有相同类型元素的可变长度的序列。与数组的固定长度不同,切片也被称之为动态数组。
Go提供了4中方案定义切片:
或者从数组或切片生成新切片:
slice [开始索引:结束索引]
slice 表示目标切片对象。
开始索引和结束索引对应目标切片的索引。
不包含结束索引对应的元素
缺省开始索引,表示从头到结束索引。
缺省结束索引,表示从开始索引到末尾。
两者同时缺省时,全部切取,与切片本身等效。
两者同时为0时,等效于空切片,一般用于切片复位。
以从数组创建切片为例,理解切片,定义语法如上所示,下图为slice:
切片的实现是由一个底层数组以及其上面的动态位置,尺寸来实现。由内部由指向起始元素的指针、元素数量length和容量capacity组成。其中:
指针ptr,用于指向切片在底层数组的起始位置。
尺寸len,用于记录切片内元素数量。
容量cap,当前切片最大容量,也就是底层数组的容量。可以动态分配。
切片为引用类型。
切片的默认初始值为nil。
切片支持: len()尺寸, cap()容量, append()追加元素等操作。详见切片的使用。
晚安,一家之言,欢迎讨论
领取专属 10元无门槛券
私享最新 技术干货