go语言提供了一种功能强悍的类型:切片(动态数组),切片不是固定的,他是围绕数组进行的封装,你能够在切片中动态添加元素,所以切片的容量也会增加,定义的时候就开辟了内存空间。
go语言数组(array)
go语言中数组(array)(数组就是一种数据集合)的长度是固定的,不可以改变,所以你想实现不固定的长度数组,go语言提供了强悍的切片功能。
什么是go语言切片(slice)?
go语言切片(slice)的结构是什么?
go语言提供了一种功能强悍的类型:切片(动态数组),切片不是固定的,他是围绕数组进行的封装,你能够在切片中动态添加元素,所以切片的容量也会增加,定义的时候就开辟了内存空间。
go语言定义切片(slice)方式一
定义切片首选需要声明一个没有指定大小的数组(array)来定义切片。
var identifier(标识符) []type(类型)
go语言定义切片(slice)方式二
使用make()函数来创建切片,有三个参数, 第一个是我们分配的类型,第二个是类型的“长度”,第三个是类型的“容量”(这个参数是可选的)。
var identifier(标识符) []type(类型) = make([]type(类型), len(长度), capacity(容量))
简写方式
identifier(标识符) := make([]type(类型), len(长度))
长度和容量关系
在往切片中追加的数据个数大于容量的时候,容量如果不够了,会在内部自动扩容,扩容为当前长度的两倍。
当容量超过1024时,每次扩容则只增加当前容量的四分之一。
切片示例代码
// 创建切片
var numbers []int
// 创建切片
var numbers_one = []int{123,456,789}
// 简写创建切片
numbers_two := []int{123,456,789}
// make创建切片
var usernames = make([]int, 3, 8)
容易混淆概念
创建切片的指针类型
var names = new([]int)
特点:容量,长度都为0,数据为空,定义的时候就开辟了内存空间,可通过&names获取内存地址。
指针类型指向的是内存地址,存储的是切片的数据内存地址。
声明指针类型,不做初始化,不开辟内存空间,创建了一个指针,指向了一个空值nil。
var ages *[]int
go切片定义示例
var price = make([]float, 2.56, 5.66)
fmt.Println(len(price), cap(price)) // 获取输入长度和容量
// 如果以下面的方式创建切片,长度为:5,容量为:5,值为int的初始值(存储了三个0)
data := make([]int, 5)
示例代码
package main
import "fmt"
func main() {
var numbers []int
var numbers_one = []int{123, 456, 789}
numbers_two := []int{123, 456, 789}
var usernames = make([]int, 3, 8)
var names = new([]int)
var ages *[]int
var price = make([]float32, 2, 10)
data := make([]int, 5)
fmt.Println(numbers)
fmt.Println(numbers_one)
fmt.Println(numbers_two)
fmt.Println(usernames)
fmt.Println(names)
fmt.Println(ages)
fmt.Println(len(price), cap(price)) // 获取输入长度和容量
fmt.Println(len(data), cap(data)) // 获取输入长度和容量
}
打印示例代码
[]
[123 456 789]
[123 456 789]
[0 0 0]
&[]
<nil>
2 10
5 5
go语言如何往切片中追加数据?
var demo_one = make([]string, 1, 3)
通过append往demo_one切片中添加数据
var demo_two = append(demo_one, 15)
示例代码
package main
import "fmt"
func main() {
var demo_one = make([]string, 1, 3) // 第一个值初始化空字符串
var demo_two = append(demo_one, "15") // 第二个值字符串15
var demo_three = make([]int, 1, 3) // 第一个值初始化0
var demo_four = append(demo_three, 15) // 第二个值整形15
var demo_five = append(demo_two, "20")
var demo_six = append(demo_four, 20)
demo_two[0] = "100"
demo_four[0] = 100
fmt.Println(demo_one) // 输出 []
fmt.Println(demo_two) // 输出 [ 15]
fmt.Println(demo_three) // 输出 0
fmt.Println(demo_four) // 输出 [0 15]
fmt.Println(demo_five)
fmt.Println(demo_six)
}
示例输出
[100]
[100 15]
[100]
[100 15]
[100 15 20]
[100 15 20]
通过append扩容之后,重新开辟了一个新的空间来存储新的切片,所以demo_one还是原先的demo_one,但是demo_two已经不是新的切片。
转载注明:
感谢博主,喝杯咖啡~
感谢博主,喝杯咖啡~
还没有人发表评论