复合数据类型
前面介绍了基础数据类型,接下来我将介绍以下四种复合数据类型。
数组
1、指定元素长度并初始化
var arr1 [3]int //长度为3,初始值为0
arr2 := [3]int{1,2,3} //长度为3
2、自动推导长度
arr3 := [...]int{1,2,3,4} //根据初始化元素数量推导
3、指定索引位置初始化
arr4 := [4]int{1 : 5, 2 : 9} //第2个元素为5,第三个为9
4、部分元素初始化
arr5 := [5]int{2,4} //前两个位置为2和4,其余位置为0
slice
slice和数组的区别
一开始这两个我一直搞不明白,后来查了一下它们的区别才知道两者的用途。
- 长度区别:数组是具有固定长度的数据结构,一旦创建,其长度不能改变,而切片可以根据需要动态增长或缩小。
- 语义区别:数组在赋值操作中传递的是整个数据副本。切片是对数组的引用,赋值或传递切片时只传递指向底层数组的引用,并不进行数据复制。
- 长度和容量:数组的长度在创建时被指定,不可更改。切片有长度和容量两个概念,长度是切片当前包含的元素个数,容量是从切片的开始位置到底层数组末尾的元素个数,切片长度可以小于容量。
- 声明:数组声明需要指明长度,而切片不需要指明长度。
slice的创建
//slice可以用切片表达式来创建,也可以用make函数创建
arr := [5]int{1, 2, 3, 4, 5}
slice1 := arr[1:4] // 创建一个从索引1到3的切片,包含元素[2, 3, 4]
slice2 := make([]int, 3, 5) // 创建一个长度为3、容量为5的切片
slice的遍历
slice := []int{1, 2, 3}
for index, value := range slice {
fmt.Printf("Index: %d, Value: %d\n", index, value)
}
常与slice一起使用的函数
- append:将元素追加到切片的末尾,如果切片容量不足,会创建一个新的底层数组并复制数据。
slice = append(slice, 4, 5) - len:返回切片中元素的个数。
length := len(slice) - cap: 返回切片的容量,即从切片的开始位置到底层数组末尾的元素个数。
capacity := cap(slice) - make:创建一个指定类型、长度和容量的切片。
slice := make([]int, 3, 5)
map
map是一种用于存储键值对的集合型数据结构,类似于python的字典。这里介绍一下基本内容
创建和初始化 map
// 使用 make 函数创建
map map1 := make(map[string]int)
// 使用字面值初始化
map ages := map[string]int{ "AA": 25, "BB": 30, }、
map操作
// 增加键值对
map1["CC"] = 28
// 修改值
ages["AA"] = 26
// 删除键值对
delete(ages, "BB")
// 查询值,检查键是否存在
age, exists := ages["AA"]
结构体
定义结构体
type Person struct {
Name string
Age int
}
创建结构体实例
person := Person{
//记得后面有', '
Name: "John",
Age: 30,
}
函数
函数声明
在Go语言中,函数的定义遵循以下模板:
func 函数名(参数列表) 返回值类型 {
// 函数体
// 可以包含一系列语句和操作
return returnValue // 如果有返回值,使用 return 语句返回
}
多返回值函数
go语言中函数返回值可以为多个,其他语言函数只能返回一个值,有的时候需要返回多个值就很不方便,go语言很好的解决了这个问题
func d(a int, b int) (int, int) {
return a , b
}
匿名函数
func main() {
add := func(a, b int) int {
return a + b
}
result := add(3, 5)
// 调用匿名函数
}
函数作为参数
go语言函数也可以作为参数
func operate(a int, b int, operation func(int, int) int) int {
return operation(a, b)
}
func add(a int, b int) int {
return a + b
}
result := operate(3, 5, add)
// 调用 operate 函数,并将 add 函数作为参数传递