Go 语言笔记:基础数据类型
布尔型
布尔型的值是常量的 true 或者 false, 默认值是 false
var flag bool
var isMale bool = true
var isFemale = false数字类型
数字类型分为 int、uint、float、complex、byte、rune、uintptr 等
整型
整型主要分为 int、uint 两大类,详见表格如下
| 类型 | 有无符号 | 范围 |
|---|---|---|
| uint8 | 无符号 8 位整型 | 0--255 |
| uint16 | 无符号 16 位整型 | 0--65535 |
| uint32 | 无符号 32 位整型 | 0--4294967295 |
| uint64 | 无符号 64 位整型 | 0--18446744073709551615 |
| int8 | 有符号 8 位整型 | -128--127 |
| int16 | 有符号 8 位整型 | -32768--32767 |
| int32 | 有符号 8 位整型 | -2147483648--2147483647 |
| int64 | 有符号 8 位整型 | -9223372036854775808--9223372036854775807 |
特殊整型
Go 对于 int 和 uint 这两种在不同平台的实现不一样,
| 类型 | 描述 |
|---|---|
| uint | 32 位操作系统上就是 uint32,64 位操作系统上就是 uint64 |
| int | 32 位操作系统上就是 int32,64 位操作系统上就是 int64 |
| uintptr | 无符号整型,用于存放一个指针 |
在使用 int 和 uint 类型时,不能假定它是 32 位还是 64 位,应考虑其在不同平台上的差异化。
字符类型
Go 语言中单个字符有两种,一种是代表 ASCII码,一种是代表 UTF-8 字符
byte是uint8的别名,等同之,主要区别是 byte 用来标识ASCII码字符, 而uint8标识数字rune是int32的别名,等同之,主要区别是 byte 用来标识UTF-8字符, 而uint8标识数字
package main
import "fmt"
func main() {
str := "hello, 柠檬"
println(len(str))
// 打印 ASCII 码长度,使用 len 函数取长度
for i := 0; i < len(str); i++ {
print(string(str[i]))
}
// 打印出 unicode 字符,使用 range 函数取长度
for i, s := range str {
print(i, "=", s, "\n")
}
}打印结果:
13
hello, æ æª¬
unicode: 0 h
unicode: 1 e
unicode: 2 l
unicode: 3 l
unicode: 4 o
unicode: 5 ,
unicode: 6
unicode: 7 柠
unicode: 10 檬可以看到这里的长度 13 和我们普遍认为字符串的长度 9 不一样,是因为 len 函数默认是以 ASCII 码的方法统计长度,可以认为统计的是字节长度。 这样打印出来的中文是乱码,此时拿到的字符类型是 ASCII 码,其代表不了中文字符,可以使用 range 函数遍历打印出中文,可以看到 "柠檬" 这两个中文字符各占 3 个字节。 但此时长度也不是我们认为的 9,依然是 13,这里打印的是下标 i。总结,
len函数可以用来获取切片、字符串、通道(channel)的长度,区别是对于字符串,len统计的字符串的 byte 个数, 而中文是以 UTF-8 格式存储的,UTF-8 是一种变长的编码方法,字符长度从 2 个字节到 4 个字节不等,因此当含有中文的字符串,统计其长度应使用如下的方式:
package main
import (
"strings"
"unicode/utf8"
)
func main() {
str := "hello, 柠檬"
// 方式一,将字符串转换成 rune
r := []rune(str)
println(len(r)) // 9
// 方式二,使用内置包 unicode/utf8 中的函数
println(utf8.RuneCountInString(str))
// 方式二,使用内置包 strings 中的函数
println(strings.Count(str, "") - 1)
}浮点型
通常情况下应该优先选择 float64, 因为 float32 能精确表示的整数位并不是很大,且累计计算误差很容易超过最大值。
| 类型 | 范围 |
|---|---|
| float32 | IEEE-754 32位浮点型数 |
| float64 | IEEE-754 64位浮点型数 |
复数类型
Go 中存在复数的概念,复数由三部分组成 RE + IMi, 其中 RE 和 IM 分别表示复数的实数和虚数部分,i 为复数单位。
TIP
对于一个复数 z := complex(x, y),可以通过内置函数 real(z) 来获得该复数的实部,也就是 x; 通过 imag(z) 获得该复数的虚部,也就是 y。 复数也可以使用 == 和 != 来进行比较,只有当实数和虚数都一致时,才认为两个复数相等,操作复数优先选择 complex128, 因为内置的 math 和 cmplx 包提供的函数使用的类型都是该类型。
| 类型 | 范围 | 声明方式 |
|---|---|---|
| complex64 | 32 位实数和虚数 | var name complex64 = complex(x, y) |
| complex128 | 64 位实数和虚数 | var name complex128 = complex(x, y) |