深入学习Go语言中的复合类型:数组、切片、映射(Map)和结构体。这些类型是构建复杂数据结构和实现复杂逻辑的基础。
目录
1. 数组(Array)
遍历数组
多维数组
数组作为函数参数
2. 切片(Slice)
切片的长度和容量
添加元素到切片
切片的切片操作
使用make创建切片
多维切片
遍历切片
3. 映射(Map)
检索映射中的元素
删除映射中的元素
使用make创建映射
遍历映射
4. 结构体(Struct)
结构体作为函数参数
使用指针操作结构体
定义结构体的方法
var arr [n]Type
,其中n
是数组的长度,Type
是存储元素的类型。var arr [5]int
arr[0] = 1
fmt.Println(arr) // 输出:[1 0 0 0 0]
// 使用for循环遍历数组
for i := 0; i < len(arr2); i++ {
fmt.Printf("arr2[%d] = %d\n", i, arr2[i])
}
// 使用for range遍历数组
for index, value := range arr2 {
fmt.Printf("索引:%d, 值:%d\n", index, value)
}
// 声明一个二维数组
var matrix [2][3]int
matrix[0] = [3]int{1, 2, 3}
matrix[1] = [3]int{4, 5, 6}
fmt.Println("二维数组:", matrix)
// 数组作为函数参数
sum := sumArray(arr2)
fmt.Println("数组和:", sum)
}
// 函数接受一个整型数组作为参数
func sumArray(arr [5]int) int {
sum := 0
for _, value := range arr {
sum += value
}
return sum
}
var slice []Type
,切片不需要指定长度。slice := []int{1, 2, 3}
slice = append(slice, 4)
fmt.Println(slice) // 输出:[1 2 3 4]
// 使用len和cap函数
fmt.Println("长度:", len(slice2), "容量:", cap(slice2))
// 添加元素到切片
slice2 = append(slice2, 6)
fmt.Println("添加元素后的切片:", slice2)
// 创建切片的切片
subSlice := slice2[1:3]
fmt.Println("切片的切片:", subSlice)
// 使用make创建切片
slice3 := make([]int, 3) // 长度为3的切片
fmt.Println("使用make创建的切片:", slice3)
// 创建一个二维切片
twoDSlice := make([][]int, 3)
for i := 0; i < 3; i++ {
innerLen := i + 1
twoDSlice[i] = make([]int, innerLen)
for j := 0; j < innerLen; j++ {
twoDSlice[i][j] = i + j
}
}
fmt.Println("二维切片:", twoDSlice)
// 使用for range遍历切片
for index, value := range slice2 {
fmt.Printf("索引:%d, 值:%d\n", index, value)
}
}
var mapVar map[KeyType]ValueType
。m := make(map[string]int)
m["key1"] = 7
m["key2"] = 13
fmt.Println(m) // 输出:map[key1:7 key2:13]
// 检索键值对
age, ok := map2["Alice"]
if ok {
fmt.Println("Alice的年龄:", age)
} else {
fmt.Println("Alice不在映射中")
}
// 删除键值对
delete(map2, "Bob")
fmt.Println("删除Bob后的映射:", map2)
// 使用make创建映射
map3 := make(map[string]int)
map3["Dave"] = 28
fmt.Println("使用make创建的映射:", map3)
// 使用for range遍历映射
for key, value := range map2 {
fmt.Printf("键:%s, 值:%d\n", key, value)
}
}
type StructName struct { Field1 Type1; Field2 Type2; ... }
。type Person struct {
Name string
Age int
}
var p Person
p.Name = "Alice"
p.Age = 30
fmt.Println(p) // 输出:{Alice 30}
// 调用函数,传递结构体作为参数
printPerson(person1)
printPerson(person2)
}
// 函数接受一个Person类型的参数
func printPerson(p Person) {
fmt.Printf("%s is %d years old.\n", p.Name, p.Age)
}
// 使用指针修改结构体
changeName(&person1, "Alice Cooper")
fmt.Println("Updated Person 1:", person1)
}
// 函数接受一个指向Person的指针,并修改其中的字段
func changeName(p *Person, newName string) {
p.Name = newName
}
// Person类型的方法
func (p Person) Greet() {
fmt.Println("Hi, my name is", p.Name)
}
func main() {
person1 := Person{Name: "Alice", Age: 30}
person1.Greet() // 调用Person的方法
}