go语言之数据类型
分类
Go的数据类型分为四大类:
- 基础类型。数字、字符串、布尔型
- 聚合类型。数组、结构体
- 引用类型。指针、slice、map、函数、管道
- 接口类型。
整数
Go原生的整数分为有符号和无符号:
-
有符号:int8、int16、int32、int64
-
无符号:uinit8、uint16、uint32、uint64
除了原生类型,Go还有一些衍生整数:
int/uint
,这两者大小相同,其字节长度取决于硬件平台和编译器,长度为:32位或64位。一般是该平台上运算效率最高的类型。rune
,与int32
是同义词,通常用来表示一个Unicode码点byte
,与unit8
是同义词,uintptr
,大小不确定与平台和编译器有关,但足以存放指针(每个平台指针的字节长度也不一样)。仅用于底层编程,如与C程序库交互的地方。
注意:即便int
与int32
是相似的类型,但也是不同的类型,如果int值想当做int32使用,必须进行显示类型转换。
浮点数
浮点数有两种类型:
- float32,数值范围(-3.4e38, -1.4e-45, 0, 1.4e-45, 3.4e38)
- float64,数值范围(-1.8e308,-4.9e-324, 0, 4.9e-324, 1.8e308)
在math包中记录了两种类型的最大值。绝大多数下优先选择float64,float32精度低累计误差较大(除非可控)。
浮点数常量的表示:
- 小数点前数字可省略,.234
- 小数点后数字可省略,23.
- 科学计数法,2e23, 4E23,非常大或者非常小的值建议使用此方式
NaN,表示科学上无意义的运算结果,如0/0,sqrt(-1),通过match.IsNaN() 函数判断一个变量或表达式的值是否为NaN。
复数
go支持两种类型的复数:
- complex64,由float32构成
- complex128,有float64构成
复数常量的表示:
- 纯虚数,如:5i
- 复数,如:1+4i
布尔值
布尔类型 :bool
,只有两个取值true
和false
。
&&运算和||运算时具有短路行为特性的:如果运算符左边的操作数已经能直接确定总体结果,那右边的操作数不会计算。
bool无法隐式转换成整型,反之也不行。
常量(const变量)
常量是一种表达式,所有常量基本都属于基本类型:
- 布尔型
- 字符串
- 数字(整型、浮点、复数)
常量在语法上与变量类似,只是值恒定不变,其值在编译阶段得到(常量在编译时会使用具体值替换)。
const name string= "Jim"
const pi = 3.14159 // 定义了常量 pi,没有指定类型根据值决定类型
对于常量的操作其结果依然是常量,如数学运算、逻辑运算、比较运算。
如果指定一组常量,除第一项之外其他项可以省略赋值,默认使用前一项的值:
const (
a = 1
b // 默认使用a的值
c = 2
d // 默认使用c的值
)
常量生成器 iota
iota从0开始取值,逐项加1:
const(
red int = iota // red 取值 0
blue // 取值iota,为1
yellow // 取值iota,为2
)
无类型常量(字面量)
golang中的无类型常量其实就是字面量的意思。一共分为六种:
- 无类型布尔(布尔字面量,默认类型bool):true/false
- 无类型整数(整数字面量,默认类型int):12、45、3456等
- 无类型浮点数(浮点字面量,默认类型float64):0.0、123.44等
- 无类型复数(复数字面量,默认类型complex128):0i、23+31i
- 无类型文字符号(字符字面量,默认类型rune):\u0000
- 无类型字符串(字符串字面量,默认类型string):“hello, 世界”
将无类型常量赋值给变量时,会隐式转换为该变量类型:
var f float64 = 3+4i // 将复数 隐式转换为 float64
f = 2 // 将2 隐式转换为float64
// 没有指定变量类型时,无类型常量会被隐式转换为默认类型
i := 23 // 23 被默认转换为 int,i也为int
f := 23.4 // 23.4 被默认转换为float64,f也为float64
运算符
优先级 | 运算符 | 结合性 | 备注 |
---|---|---|---|
1 | ^(取反)、!(取非) | 自右向左 | |
2 | * 、/、%(取余)、<<、>>、&(按位与)、&^(位清空) | 自左向右 | 取余只对整数有效 |
3 | +、-、|、^(异或) | 自左向右 | |
4 | ==、|=、<、<=、>、>= | 自左向右 | |
5 | && | 自左向右 | |
6 | || | 自左向右 |