📅  最后修改于: 2023-12-03 15:15:21.428000             🧑  作者: Mango
在 Go 编程语言中,有多种复合类型数据,包括数组、切片、映射、结构体和通道。这些类型数据允许我们更灵活地管理数据,提高程序的可读性和可维护性。
数组是一个固定长度且同一类型的元素的序列。在 Go 中,定义数组可以使用以下语法:
var arr [5]int // 定义一个包含 5 个 int 类型元素的数组
我们也可以使用默认值初始化数组:
arr := [3]int{1, 2, 3} // 定义一个包含 3 个 int 类型元素的数组,并初始化为 {1, 2, 3}
访问数组中的元素可以使用索引号:
fmt.Println(arr[0]) // 输出数组的第一个元素
但是数组的长度是固定的,我们不能在运行时改变它的大小。
切片是一个动态大小的序列,可以用来存储一个元素的序列。在 Go 中,定义切片可以使用以下语法:
var sli []int // 定义一个空的 int 类型切片
我们可以使用内置的 make
函数来创建一个非空的切片:
sli := make([]int, 5) // 定义一个长度为 5 的 int 类型切片
切片的长度可以使用 len
函数获取,容量则可以使用 cap
函数获取:
fmt.Println(len(sli)) // 输出切片的长度
fmt.Println(cap(sli)) // 输出切片的容量
我们可以基于一个数组或者切片来创建新的切片:
newSli := arr[0:2] // 基于 arr 数组创建一个新的长度为 2 的切片
这里的 0:2
表示新的切片会包括 arr[0]
和 arr[1]
,不包括 arr[2]
。
映射是一个无序的键/值对的集合。在 Go 中,定义映射可以使用以下语法:
var m map[string]int // 定义一个空的 string/int 类型映射
我们也可以使用字面值来初始化一个非空的映射:
m := map[string]int {"a": 1, "b": 2, "c": 3} // 定义一个包括三个键值对的映射
我们可以使用 delete
函数来删除一个键/值对:
delete(m, "a") // 删除键为 "a" 的键/值对
结构体是一种将零个或多个任意类型的命名字段组合在一起的数据类型。在 Go 中,定义结构体可以使用以下语法:
type Person struct {
name string
age int
}
我们可以创建一个结构体的实例:
p := Person{name: "Alice", age: 20} // 创建一个新的 Person 实例
fmt.Println(p.name) // 输出 p 的 name 字段
通道是一种可以让不同 Go 协程之间进行通信和同步的机制。通道支持两种操作:发送 (send) 和接收 (receive)。在 Go 中,定义通道可以使用以下语法:
ch := make(chan int) // 定义一个 int 类型通道
我们可以使用 <-
操作符来发送或接收一个值:
ch <- 1 // 发送一个 int 类型的值
value := <-ch // 接收一个 int 类型的值
当通道为空时,发送操作会被阻塞。当通道为满时,接收操作会被阻塞。因此,通道也可以用来协调流程,确保多个协程之间的同步和序列。