简单数据类型
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。
Go 语言基本数据类型有:布尔型、数字类型、字符串类型
布尔型
布尔型的值只可以是常量 true 或者 false
一个简单的例子:var b bool = true
名称 | 类型和描述 | 默认值 | 存储空间(bit) | 值范围 |
---|---|---|---|---|
bool | boolean | false | 1 | true 或 false |
数字类型
整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
名称 | 类型和描述 | 默认值 | 存储空间(bit) | 值范围 |
---|---|---|---|---|
int | 平台相关(int32/64) | 0 | 平台相关 | 平台相关 |
uint | 平台相关(uint32/64) | 0 | 平台相关 | 平台相关 |
int8 | 8位有符号整型 | 0 | 8 | -128 ~ 127 |
uint8 | 8位无符号整型 | 0 | 8 | 0 ~ 255 |
int16 | 16位有符号整型 | 0 | 16 | -32768 ~ 32767 |
uint16 | 16位无符号整型 | 0 | 16 | 0 ~ 65535 |
int32 | 32位有符号整型 | 0 | 32 | -2147483648 ~ 2147483647 |
uint32 | 32位无符号整型 | 0 | 32 | 0 ~ 4294967295 |
int64 | 64位有符号整型 | 0 | 64 | -9223372036854775808 ~ 9223372036854775807 |
uint64 | 64位无符号整型 | 0 | 64 | 0 ~ 18446744073709551615 |
float32 | 32位浮点类型 | 0.0 | 32 | IEEE-754 |
float64 | 64位浮点类型 | 0.0 | 64 | IEEE-754 |
complex64 | 由float32实部+虚部 | 0+0i | 64 | 对应 float32 |
complex128 | 由float64实部+虚部 | 0+0i | 128 | 对应 float64 |
byte | uint8的别名 | 0 | 8 | UTF-8 单个字节的值 |
rune | int32的别名 | 0 | 32 | 单个 Unicode 字符 |
uintptr | 用于一个存放指针 | 0 | 平台相关 | 平台相关 |
- 整数
- 十进制整数,使用 0-9 的数字表示且不以 0 开头。
- 八进制整数,以 0 开头,0-7 的数字表示
十六进制整数,以 0X 或者是 0x 开头,0-9|A-F|a-f 组成
浮点数由整数部分、小数点和小数部分组成,整数部分和小数部分可以隐藏其中一种。也可以使用科学计数法表示:
0. 72.40 072.40 和 72.40 一样 2.71823 1.e+0 6.67428e-11 1E6 .25 .12345E+5
复数的虚部,由一个整数或者是一个小数加上i表示
0i 011i //==11i 这里部分八进制了 0.i 2.71825i 1.e+0i 6.23423-11i 1E6i .25i .1234E+5i
byte 对应 ASCII 码的字符值
- rune 表示 Unicode 的字符
字符串类型:
字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。
Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
Go 语言支持以下 2 种形式的字符串:
str := "laoYu" // 解释性字符串,该类字符串使用双引号括起来,其中的相关的转义字符将被替换
`This is a raw string \n` // 原生字符串该类字符串使用反引号括起来,支持换行
- string 是不可改变的,一旦创建,string 的内容就不能被改变。
a := “test”
a[1] = ‘a’ // 不能改变 string 的值
&a[i] // 不能对 string 的元素进行取地址
a[i] // 访问的是第i个 byte len(i)是 byte 的个数,unicode可能占据多个 byte
for , ch := range a {
// 可以遍历string的每一个unicode
}
for , uni := range []rune(a) {
// 可以遍历string的每一个unicode
}
for _, ch := range []byte(a) {
//可以遍历string的每一个 byte
}
- 字符串底层设计
点击查看 字符串底层设计type stringStruct struct { str unsafe.Pointer // 指向一个 [len]byte 的数组 len int // 长度 }
str 为字符数组,len 为数组长度。Go 的字符串是不可变类型,对 string 类型的变量初始化意味着会对底层结构的初始化。 至于为什么str用byte类型而不用rune类型,Go 的 for 循环对字符串的遍历是基于字节的,所以 str 用 byte 类型而不用 rune 类型。
当然,如果有必要,可以转成 rune 切片或使用 range 来迭代。
内建函数 len 对 string 类型的操作是直接从底层结构中取出 len 值,不需要额外的操作,当然在初始化时必需同时初始化 len 的值。