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