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) |