谈到Go的数据类型和表达式时,需要掌握以下这些知识:
bool
、string
、int
、int8
、int16
、int32
、int64
、uint
、uint8
、uint16
、uint32
、uint64
、uintptr
、byte
、rune
、float32
和float64
。其中byte
是uint8
的别名,rune
是int32
的别名。下面是关于Go基本数据类型的总结:
类型名称 | 类型描述 | 大小(字节) | 默认值 | 范围 |
---|---|---|---|---|
bool | 布尔类型 | 1 | false | true、false |
byte | 字节类型 | 1 | 0 | 0~255 |
rune | Unicode字符类型 | 4 | 0 | -2147483648~2147483647 |
int | 整数类型 | 平台相关 | 0 | 最大值和最小值取决于平台,通常为-2147483648~2147483647 |
int8 | 8位整数类型 | 1 | 0 | -128~127 |
int16 | 16位整数类型 | 2 | 0 | -32768~32767 |
int32 | 32位整数类型 | 4 | 0 | -2147483648~2147483647 |
int64 | 64位整数类型 | 8 | 0 | -9223372036854775808~9223372036854775807 |
uint | 无符号整数类型 | 平台相关 | 0 | 最大值取决于平台,通常为0~4294967295 |
uint8 | 8位无符号整数类型 | 1 | 0 | 0~255 |
uint16 | 16位无符号整数类型 | 2 | 0 | 0~65535 |
uint32 | 32位无符号整数类型 | 4 | 0 | 0~4294967295 |
uint64 | 64位无符号整数类型 | 8 | 0 | 0~18446744073709551615 |
uintptr | 指针类型 | 平台相关 | 0 | 保存指针地址的整数值 |
需要注意的是,Go语言中支持隐式类型转换,但是不同类型之间的转换需要满足特定的规则。另外,Go还提供了一种复合类型complex
,用于表示复数。complex
由实部和虚部两个float32
或float64
类型组成,可以用于数学运算。
类型名称 | 类型描述 | 大小(字节) | 初始化方式 |
---|---|---|---|
数组(Array) | 在内存中连续存储多个同类型元素的集合,长度固定不变 | n * 元素大小 | var a [n]T 、a := [n]T{value1, value2, ..., valuen} 、a := [...]T{value1, value2, ..., valuen} |
切片(Slice) | 动态数组,由指向底层数组的指针、长度和容量三部分组成 | 24 | var s []T = make([]T, len, cap) 、s := []T{value1, value2, ..., valuen} 、s := make([]T, length) 、s := make([]T, length, capacity) |
映射(Map) | 存储键值对的无序集合,每个键唯一对应一个值 | 平均8字节/条记录 | var m map[T]U = make(map[T]U) 、m := map[T]U{key1: value1, key2: value2, ..., keyn: valuen} |
通道(Channel) | 用于协程间通信的管道,支持发送和接收数据 | 0或者1 | var ch chan T = make(chan T) 、ch := make(chan T, buffer) |
结构体 (Struct) | 自定义类型,它由一系列不同类型的字段组成。结构体中的每个字段都有自己的标识符和类型。 | N/A | type person struct { name string age int } var p person p = person{name: "Alice", age: 30} |
需要注意的是,Go 语言中除了数组和结构体外,其他数据类型都是引用类型。这意味着切片、映射等类型在传递给函数或赋值给变量时,实际上是传递了一个指向底层数据结构的指针。因此,在操作这些数据类型时需要小心避免出现副作用。
以下是一些关于Golang复合数据类型数组(Array)的一些例子
var names [3]string
names[0] = "Alice"
names[1] = "Bob"
names[2] = "Charlie"
var flags [4]bool
flags[0] = true
flags[1] = false
flags[2] = false
flags[3] = true
var prices [5]float64
prices[0] = 1.99
prices[1] = 2.99
prices[2] = 3.99
prices[3] = 4.99
prices[4] = 5.99
type Person struct {
Name string
Age int
}
var people [2]Person
people[0] = Person{"Alice", 30}
people[1] = Person{"Bob", 25}
var matrix [3][3]int
matrix[0] = [3]int{1, 2, 3}
matrix[1] = [3]int{4, 5, 6}
matrix[2] = [3]int{7, 8, 9}
以下是一些关于Golang复合数据切片(Slice)类型的一些例子
numbers := []int{1, 2, 3, 4, 5}
以上代码定义了一个名为 numbers
的整数类型切片,其中包含元素 1、2、3、4 和 5。可以通过下标访问切片中的元素。
还可以使用 make 函数来创建指定长度和容量的切片:
numbers := make([]int, 5, 10)
该语句创建了一个长度为 5,容量为 10 的整数类型切片。此时所有元素默认初始化为0。
可以使用 append()
函数将元素添加到切片末尾:
numbers = append(numbers, 6, 7, 8)
此时 numbers
切片的元素变成了 1、2、3、4、5、6、7 和 8。
还可以通过切片操作来获取子切片:
subNumbers := numbers[2:5]
以上代码创建了一个从索引 2 开始,到索引 5 结束(不包括索引 5)的子切片。子切片 subNumbers
包含元素 3、4 和 5。
以下是一些关于Golang复合数据映射(Map)类型的一些例子
ages := map[string]int{
"Alice": 30,
"Bob": 25,
"Charlie": 35,
}
以上代码定义了一个名为 ages
的映射,其中键为字符串类型,值为整数类型。它包含三个条目,分别表示 Alice、Bob 和 Charlie 的年龄。
可以使用索引操作符 []
获取映射中的值:
fmt.Println(ages["Alice"]) // 输出:30
还可以使用 make()
函数创建空映射:
scores := make(map[string]int)
该语句创建了一个名为 scores
的空映射,键为字符串类型,值为整数类型。
可以使用 delete()
函数从映射中删除条目:
delete(ages, "Bob")
此时映射中不再包含键为 Bob 的条目。
以下是一些关于Golang复合数据通道(Channel)类型的一些例子
package main
import "fmt"
func main() {
// 创建一个整数类型的通道
ch := make(chan int)
// 使用 go 关键字启动一个新的 goroutine
go func() {
// 向通道发送值
ch