4 基本数据类型
[TOC]
基本数据类型
Go是强类型的静态编译语言,内置7类基本数据类型,20个具体子类型。
不同类型变量之间不能直接运算、赋值。
类型源码的介绍在 builtin 包 builtin.go。
布尔类型
bool
整数类型
byte int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
浮点类型
float32 float64
复数类型
complex64 complex128
字符类型
rune
字符串
string
布尔类型 bool
bool类型值只有Go预置的两个标识符true和false。
true 代表真、成立。
false 代表假、不成立。
比较表达式和逻辑表达式的结果都是bool。
控制语句if else 、 for都是使用bool 类型实现。
整数类型 int
Go内置12种整数类型 byte int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64,其中byte是uint8的别名。
整数类型在编译时类型和数据范围都会被检查,如果赋值类型和赋值范围不正确都会无法通过编译。
整型字面量自动类型推断下默认为int。
数据范围
int8为占用1个字节内存,int16是2个字节,以此类推,占用内存越大则数据范围越广。
uint8表示无符号,仍是占用1字节内存,无符号将没有负数,int8的数值是-128到+127,uint8是0到255。
强制类型转换
不同类型的整型之间进行运算都要进行强制类型转换。
转换可以大到小,大转小编译不报错,但是溢出后结果会不确定
int uint 类型
在32位操作系统下int、uint类型为32字节,在64位操作系统下为64字节。
整型类型支持运算和位操作
浮点类型 float
Go提供float32、float64两种浮点数类型,用于表示包含小数点的数据。
浮点数标准为IEEE-754。
float32 符号位占1bit表示正负,指数位占8bit,小数位23bit,偏移量127。
flaot64 指数位11bit,小数位52bit,偏移量1023.
包含小数点的字面量自动类型推断为float64类型。
浮点数陷阱
浮点运算精确度难以保证,所以浮点数之间高精度的计算应该使用math标准库。
使用 github.com/shopspring/decimal 进行浮点数运算能保证精度。
fmt.Println() 和 println()打印结果不同是因为其内部对浮点数的运算不同,因此不同的运算有不同的结果,对精度难以保证。
复数类型 complex64
Go有两个复数类型,即 complex64 和 complex128 。
存储这两个类型的值的空间分别需要 8 个字节和 16 个字节。复数是由两个浮点数表示的,其中一个表示实部(real),一个表示虚部(imag)。而 complex128 类型的值会由两个 float64 类型的值分别表示复数的实数部分和虚数部分。
字符串类型 string
字符串本身是常量,可以通过数组索引方式访问但是不能通过这种方式修改。
字符串的本质是一个有两个参数的结构体,Data参数指向底层字符数组,Len代表字符长度。Go采用的是UTF-8编码,字符常量使用UTF-8字符编码集,UTF-8是一种长度可变的编码方式,可包含世界上大部分的字符,每个字符占用1到3个字节。
对字符串的切片操作返回的子串任然是string。
取string地址,得到的是string结构体的地址,并不是内部维持的数组的地址。
字符串可以转为字节切片、Unicode字符切片。
多行字符串定义 ``
字符串拼接
字符串拼接 操作符+
字符串拼接不是将一个字符串合并到另一个字符串中,是开辟一个更大的内存空间将两个字符串都复制到更大空间中。
这种方式性能很差,一般不使用。
字符串格式化
这种方式一般用于格式化字符串,不用于字符串拼接
strings.Builder 字符串拼接
字符串拼接使用这种方式,性能最好。
字符类型 rune
rune是int32类型的别名,Unicode编码字符,占用4个字节。
string的长度是按照UTF-8字节计算,rune是按照字符计算长度。
Last updated