大家好,我将梳理出的 Go语言数据类型内容,分享给大家。 请多多指教,谢谢。


类型汇总

Go 语言中,主要分为值类型主要分为三部分: 整型、浮点型和其他类型。


整型

Go语言同时提供了有符号和无符号类型的整数运算。

int int8 int16 int32 有符合和无符号类型

这里有int8、int16、int32和int64四种截然不同大小的有符号整数类型,分别对应8、16、32、64bit大小的有符号整数,与此对应的是uint8、uint16、uint32和uint64四种无符号整数类型。

这里还有两种一般对应特定CPU平台机器字大小的有符号和无符号整数int和uint;其中int是应用最广泛的数值类型。这两种类型都有同样的大小,32或64bit,但是我们不能对此做任何的假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。


uintptr 类型

uintptr 是一种无符号的整数类型 ,没有指定具体的bit大小但是足以容纳指针。uintptr 类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。

不管它们的具体大小,int、uint 和 uintptr 是不同类型的兄弟类型。其中int和int32也是不同的类型,即使int的大小也是32bit,在需要将int当作int32类型的地方需要一个显式的类型转换操作,反之亦然。


类型值范围

类型名称大小描述
int8 字节int的大小是和操作系统位数相关的,如果是32位操作系统,int类型的大小是4字节;如果是64位操作系统,int类型的大小就是8个字节
int81 字节无符号整数的所有bit位都用于表示非负数,值域是0到$2^n-1$。例如,int8类型整数的值域是从-128到127,而uint8类型整数的值域是从0到255。
int162 字节有符号int16类型整数值域是从 -32768 ~ 32767,而无符号uint16类型整数值域是从 0 ~ 65535
int324 字节有符号int32类型整数值域是从 -2147483648 ~ 2147483647,而无符号uint32类型整数值域是从 0 ~ 4294967295
int648 字节有符号int64类型整数值域是从 -9223372036854775808 ~ 9223372036854775807,而无符号uint64类型整数值域是从 0 ~ 18446744073709551615
uintptr长度4或8字节存储指针的uint32 或 uint64整数


取值范围示例


浮点型

浮点数类型的取值范围可以从很微小到很巨大。浮点数的范围极限值可以在math包找到。常量math.MaxFloat32表示float32能表示的最大数值,大约是 3.4e38;对应的math.MaxFloat64常量大约是1.8e308。它们分别能表示的最小值近似为1.4e-45和4.9e-324。


float32 float64 类型

一个float32类型的浮点数可以提供大约6个十进制数的精度,而float64则可以提供约15个十进制数的精度;通常应该优先使用float64类型,因为float32类型的累计计算误差很容易扩散,并且float32能精确表示的正整数并不是很大(译注:因为float32的有效bit位只有23个,其它的bit位用于指数和符号;当整数大于23bit能表达的范围时,float32的表示将出现误差)


complex64 complex128 类型

Go语言提供了两种精度的复数类型:complex64 和 complex128,分别对应 float32 和 float64 两种浮点数精度。

实际上,complex64类型的值会由两个float32类型的值分别表示复数的实数部分和虚数部分。 complex128类型的值会由两个float64类型的值分别表示复数的实数部分和虚数部分。

3.7E+1 + 5.98E-2i

举例,内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部:


类型值范围

类型名称大小描述
float324 字节单精度类型,占据4个字节byte,32个二进制位bit
float648 字节双精度类型比单精度类型更能精确地表示一个小数,但是占用的内存空间也比较大。
complex648 字节包含两个float32类型表示复数
complex12816 字节包含两个float64类型表示复数


其他类型

布尔型

!!truefalse(!true==false)==truex==true

举列,数字到布尔类型的转换


rune 类型

int32

常用来处理 unicode 或 utf-8 字符,通常用于表示一个Unicode码点,这两个名称可以互换使用。

runeUnicode1 - 4int32UTF-813


举例,计算中文字符:

程序输出

len()utf-813runeUnicoderune


byte 类型

同样 byte也是uint8类型 的等价类型,byte类型一般用于强调数值是一个原始的数据而不是一个小的整数。

举例,字符串和字节slice之间可以相互转换:


string 类型

UTF-8stringnilstring

字符串是一个不可改变的字节序列。 字符串可以包含任意的数据,包括byte值0, 但是通常是用来包含人类刻度的文本。文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列。

字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改字符串是由byte字节组成,所以字符串的长度是byte字节的长度。

Go语言源文件总是用UTF8编码, 并且Go语言的文本字符串也是以UTF8编码的方式处理,因此我们可以将Unicode码点也写到字符串面值中。

举例,拼接字符串:


error 类型

error 类型是 Go 语言的一种内置类型,使用的时候不用特定去import,它本质上是一个接口。

举例,封装自定义错误类型: