slice
go语言的切片是对数组的抽象。
数组的使用
package main import ( "fmt" ) // 传递固定长度的数组还是值传递的方式 func printarray(myarray [5]int) { for index, value := range myarray { fmt.println("index:", index, "value:", value) } } func main() { var myarr [5]int myarr2 := [10]int{1, 2, 3, 4} myarr3 := [4]int{1, 2, 3, 4} myarr4 := []int{1, 2, 3, 4} for i := 0; i < len(myarr); i++ { fmt.println(myarr[i]) } for index, value := range myarr2 { fmt.println("index:", index, "value:", value) } fmt.printf("myarr1 type=%t\n", myarr) fmt.printf("myarr2 type=%t\n", myarr2) fmt.printf("myarr3 type=%t\n", myarr3) }
注意:
数组传递的参数是以值拷贝的形式进行传递,如下:(在函数中修改了,但在主函数中并没有变化)
package main import ( "fmt" ) // 传递固定长度的数组还是值传递的方式 func printarray(myarray [5]int) { for index, value := range myarray { fmt.println("index:", index, "value:", value) } myarray[0] = 15 } func main() { myarr2 := [5]int{1, 2, 3, 4} printarray(myarr2) fmt.println("==================") for index, value := range myarr2 { fmt.println("index:", index, "value:", value) } }
go数组的长度不可改变,在特定的场景中这样的集合就不太适合了,go中就提供了内置类型切片(动态数组),与数组相比,切片的长度是不固定的,可以追加时可能使得切片的容量增大。
定义切片
可以声明一个未指定大小的数组来定义切片(切片不需要说明长度。)
var identifier []type
使用make()函数来创建切片:
var slice1 []type = make([]type, len) 也可以简写为 slice1 := make([]type, len) //也可以指定容量,其中capacity为可选参数。 make([]t, length, capacity)
切片的四种初始化的方式
package main import "fmt" func main() { //声明slice是一个切片,并且初始化,默认值是1,2,3长度是len=3 slice1 := []int{1, 2, 3} //声明slice是一个切片,但是并没有为slice分配空间 var slice2 []int slice2 = make([]int, 10, 15) slice2[0] = 100 //声明slice是一个切片,同时给slice分配3个空间,初始化值是0 var slice3 []int = make([]int, 10) //声明slice是一个切片,同时为slice分配空间,10个空间,初始化值是0,通过:=推导出slice是一个切片 slice4 := make([]int, 10) fmt.printf("len=%d,slice=%v\n", len(slice1), slice1) fmt.printf("len=%d,slice=%v,cap=%d\n", len(slice2), slice2, cap(slice2)) fmt.printf("len=%d,slice=%v\n", len(slice3), slice3) fmt.printf("len=%d,slice=%v\n", len(slice4), slice4) }
切片的追加,截取与拷贝
切片示意图:
追加
如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来
长度增加后,超过容量,则容量增加2倍
package main import "fmt" func main() { var numbers = make([]int, 3, 5) fmt.printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers) numbers = append(numbers, 1) fmt.printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers) numbers = append(numbers, 1) numbers = append(numbers, 1) fmt.printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers) }
截取
s := []int{1, 2, 3} //左闭右开 s1 := s[0:2] s1[0] = 100 s[1] = 200 fmt.printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s) fmt.printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)
拷贝
截取是采用的浅拷贝,是指向的同一个地址。
如果要深拷贝。可以使用copy函数
s := []int{1, 2, 3} var s1 = make([]int, 3) copy(s1, s) s1[0] = 100 fmt.printf("len=%d,cap=%d,slice=%v\n", len(s), cap(s), s) fmt.printf("len=%d,cap=%d,slice=%v\n", len(s1), cap(s1), s1)
到此这篇关于golang中slice切片的实现示例的文章就介绍到这了,更多相关golang slice切片内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论