GO 语言学习 之 数组和切片
预告 : 切片主要有学习两种用法和应用示例
这里重点是切片,数组的化其实我们可能用到的不会太多,切片本质上是一个边长数组,所以这个应用比较防范,因为大多数情况下,我们都不能确定数组的长度,所以使用切片相对容易轻松了许多。
数组
定义:
var variable_name [SIZE]data_type
其中,variable_name 是数组的名称,SIZE是数组的大小,data_type是数组中元素的数据类型
- 数组长度必须是常量,且是类型的组成部分,一旦创建,大小不可变。
- 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。
- 数组通过索引进行访问,从0到 len() - 1,超出范围会触发 painc
- 数组是值类型,赋值和传参会传递一个一摸一样的副本,而不是指针,所以对副本的修改不会传递到原值
- 数组支持多维数组
常见用法:
创建数组:
package mainimport "fmt"func main() {var a1 [5]int // 声明一个包含 5 个整数的数组var a2 = [3]int{1, 2, 3} // 初始化一个包含 3 个整数的数组a3 := [...]int{1, 2, 3, 4, 5} // 根据元素数量自动推导出数组长度fmt.Println(a1)fmt.Println(a2)fmt.Println(a3)
}
数组的常见操作:
package mainimport "fmt"func print_array(array [5]int) {for i := 0;i < len(array);i++ {fmt.Println("print_array 输出数组元素 ", i, " 值为 ", array[i])}
}func main() {var a1 = [5]int {1,2,3,4,5}// 数组的长度fmt.Println("数组 a1 的长度 ", len(a1))// 遍历数组for i := 0;i < len(a1);i++ {fmt.Println("数组元素 ", i, " 值为 ", a1[i])}// 修改数组的内容a1[2] = 20fmt.Println("修改后数组的内容 : ", a1)// 函数实参print_array(a1)
}
切片
切片的本质是一个结果体类型,他管理某一个数组类型,所以也算是引用类型。切片在作为参数或者赋值语句中,相当于值拷贝,结果是两个变量指向同一个数组。接着上面说,当遇到修改切片内容的时候,可能会触发扩容,一旦其中一个触发扩容后,这俩变量就不一样啦。切片作为一个变长数组使用,应该很容易理解了。
定义:
var variable_name []data_type
其中,variable_name 是数组的名称,[] 是类型的一部分不能省略,data_type是数组中元素的数据类型
切片是数组的引用,它并不存储数据,而是指向数组中的一个部分。
切片包含三个主要的部分:
指针:指向数组中切片的第一个元素。
长度:切片的元素个数。
容量:切片所能容纳的最大元素数量,它是从切片的起始位置到数组末尾的元素数量。
切片的遍历和访问操作与数组相同,只是多了一个 cap(), 是数组的实际容量
切片的 零值 为 nil
常见用法:
创建切片:
创建切片有三种方式:
- 使用
[]Type{}
直接创建切片- 使用
make
创建切片- 使用数组的切片操作创建切片
package mainimport "fmt"func main() {var a []intb := []int {1,2,3}c := make([]int, 3, 8)d := b[:2]e := b[0:]f := b[1:2]fmt.Println(a)fmt.Println(b)fmt.Println(c)fmt.Println(d)fmt.Println(e)fmt.Println(f)
}
s4 := make([]int, 0, 5)
s4 = append(s4, 1, 2, ...)
s4 = append(s4, s3...)
切片的常见操作:
- 访问切片元素:
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println(a[0], a[1], a[4])
}
- 切片的修改
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println("修改之前:", a)a[3] = 10fmt.Println("修改之后", a)
}
- 向切片添加元素
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println("修改之前:", a)a = append(a, 6)fmt.Println("添加一个元素:", a)
}
- 拷贝切片
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}b := make([]int, len(a))copy(b, a) // 将 a 拷贝到 bfmt.Println("a 切片的内容:", a)fmt.Println("b 切片的内容:", b)
}
- 切片的扩容
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println("a的长度 ", len(a), "a的容量 ", cap(a), "扩容之前的内容:", a)a = append(a, 6,7,8,9,10)fmt.Println("a的长度 ", len(a), "a的容量 ", cap(a), "扩容之后的内容:", a)
}
- 遍历切片
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}for i := 0; i < len(a); i++ {fmt.Println("第 ", i, "个元素:", a[i])}
}