概述
虽然从底层而言,所有的数据都是由比特组成,但计算机一般操作的是固定大小的数,如整数、浮点数、比特数组、内存地址等。进一步将这些数组织在一起,就可表达更多的对象,例如数据包、像素点、诗歌,甚至其他任何对象。Go语言提供了丰富的数据组织形式,这依赖于Go语言内置的数据类型。这些内置的数据类型,兼顾了硬件的特性和表达复杂数据结构的便捷性。 Go 语言中数据类型分为:基本数据类型和复合数据类型:
基本数据类型有:
复合数据类型有:
数组、切片、结构体、函数、map、通道(channel)、接口等。
基本类型汇总
基本类型 长度(字节) 默认值 说明 bool 1 false 只能是true或false byte 1 0 代表了 ASCII 码的一个字符,byte是uint8的别名 rune 4 0 Unicode Code Point,rune是int32的别名 int,uint 4or8 0 32 or 64位 int8,uint8 1 0 -128 ~ 127, 0 ~ 255 int16,uint16 2 0 -32768 ~ 32767, 0 ~ 65535 int32,uint32 4 0 -21亿~ 21亿, 0 ~ 42亿 int64,uint64 8 0 float32 4 0.0 float64 8 0.0 complex64 8 复数类型,32位实部和32位虚部 complex128 16 复数类型,64位实部和64位虚部 uintptr 4or8 定义在 builtin 包下,是一个整数类型(不是指针!!!)
复杂类型 长度(字节) 默认值 说明 array 值类型 struct 值类型 string “” utf-8字符串 slice nil 引用类型 map nil 引用类型 channel nil 引用类型 interface nil 接口 function nil 函数
整型
Go语言中被分为三大类:int、uint和uintptr 这三种类型的长度是跟据程序所在的操作系统来决定长度的:
- int 和 uint 在32位操作系统上,它们使用32位,4个字节,在64拉操作系统上,它们使用64位,8个字节
- uintptr 的长度被设定为存储指针的 uint32 或 uint64 整数
- int8 取值范围:-128 ~ 127
- int16 取值范围:-32768 ~ 32767
- int32 取值范围:-2,147,483,648 ~ 2,147,483,647
- int64 取值范围:-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
- uint8 取值范围:0 ~ 255
- uint16 取值范围:0 ~ 65,535
- uint32 取值范围:0 ~ 4,294,967,295
- uint64 取值范围:0 ~ 18,446,744,073,709,551,615
var Decimal int = 12
var Binary int = 0b1100
var Octonaryint = 0o14
var Hex int = 0xc
使用fmt.Printf() 函数据的格式化功能:
- %b 表示为二进制
- %c 该值对应的unicode码值
- %d 表示为十进制
- %o 表示为八进制
- %q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
- %x 表示为十六进制,使用a-f
- %X 表示为十六进制,使用A-F
- %U 表示为Unicode格式:U+1234,等价于"U+%04X"
- %E 用科学计数法表示
- %f 用浮点数表示
浮点型
Go语言支持两种浮点型数:float32 和 float64。这两种浮点型数据格式遵循 IEEE 754标准 :
- float32:精确到小数点后7位,最大值约 3.4e38,可以使用常量定义:math.MaxFloat32。
- float64:精确到小数点后15位,最大值约 1.8e308,可以使用一个常量定义:math.MaxFloat64
浮点型的零值为 0.0 ,在进行除法运算的时候,浮点型的零值可以为分母并且不会报错,而整形的就会报错。 由于精确度的缘故,你在使用 == 或者 != 来比较浮点数时应当非常小心。你最好在正式使用前测试对于精确度要求较高的运算。也可以使用 第三方包 来完成这个操作。 在日常使用中,我们经常通常都使用 float64 来来定义浮点类型,因为 math 包里面,几乎所有的方法,都支持 float64。 把 float64 转换为 int 类型:
func IntFromFloat64(x float64) int {
if math.MinInt32 <= x && x <= math.MaxInt32 {
whole, fraction := math.Modf(x)
if fraction >= 0.5 {
whole++
}
return int(whole)
}
panic(fmt.Sprintf("%g is out of the int32 range", x))
}
byte 和 rune 类型
组成每个字符串的元素叫做字符,通过遍厉字符串或者定义单个字符可以获取,定义字符时用 ’ 包裹起来。
var testRune := '国'
var testByte := 'a'
fmt.Printf("字符的类型为:%T",testRune) //rune
fmt.Printf("字符的类型为:%T",testRune) //byte
使用中文或者一些特殊字符和 Unicode 编码的时候,一般都推荐定义为 rune 类型
字符串
Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用 UTF-8 编码。 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符,例如:
var str string = "hello,世界!"
字符串其实多个是 byte 类型和 rune 类型放在一起的类型,也就是 string 类型。 转义字符
是一类特殊的字符,它们具有特殊的含义:
- \n:换行符
- \r:回车符
- \t:tab 键
- \u 或
- \U:Unicode 字符
- \:反斜杠自身