切片相关操作
Go语言切片是对数组的抽象。数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片(”动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
需要说明,slice 并不是数组或数组指针。它通过内部指针和相关属性引用数组片段,以实现变长方案
第一种切片定义和初始化
1 2 3 4 5 6 7 8 9 10
| func main() { var slice []int fmt.Printf("%#v", slice)
slice = []int{} fmt.Printf("%#v", slice)
slice = []int{1, 2, 3} fmt.Println(slice) }
|
第二种,通过索引指定切片的初始化值,未指定初始值为默认值
1 2 3 4
| func main() { name := []string{1: "zhangsan", 3: "王五"} fmt.Printf("%#v", name) }
|
第三种,通过make函数定义切片再赋值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| func main() { var names []string names = make([]string, 5) fmt.Printf("%#v", names)
var slice1 []string slice1 = make([]string, 5, 10) fmt.Printf("%#v", slice1)
var slice2 []int = make([]int,3) fmt.Printf("%#v",slice2) }
|
第四种,空接口切片,可以接收任意参数类型
1
| clice := make([]interface{},0)
|
向切片中添加修改元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| func main() { names := make([]string, 3)
names[0] = "张三" names[1] = "李四" names[2] = "王五" fmt.Printf("%#v\n", names) fmt.Println(len(names), cap(names))
names = append(names, "赵六") fmt.Printf("%#v\n",names) fmt.Println(len(names), cap(names)) }
|
删除切片中的元素
go语言暂时没有原生直接支持删除切片的方法,但是可以对切片进行切分来达到删除切片的目的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| func main() { nums := []int{1,2,3,4,5} fmt.Printf("%d\n",nums)
nums = nums[1:] fmt.Println(nums)
nums1 := []int{1,2,3,4,5} nums1 = nums1[:len(nums1)-1] fmt.Println(nums1)
nums2 := []int{1,2,3,4,5} nums22 := append(nums2[:2],nums2[3:]...) fmt.Println(nums22) }
|
遍历切片中的元素
1 2 3 4 5 6 7 8 9 10 11 12 13
| func main() { names := []string{"张三","李四","王五"}
for i:=0; i<len(names);i++{ fmt.Println(i,names[i]) }
for k,v:= range names{ fmt.Println(k,v) } }
|
切片之间的复制
两个切片类型相同、长度相同时复制
1 2 3 4 5 6 7 8 9
| func main() { A := []string{"a", "b", "c"} B := []string{"x", "y", "z"}
copy(A, B) fmt.Printf("%#v\n",A) fmt.Printf("%#v\n",B) }
|
当源切片元素比目的切片元素多时复制
1 2 3 4 5 6 7 8 9 10
| func main() { A := []string{"a", "b", "c"} B := []string{"x", "y", "z","m"}
copy(A, B) fmt.Printf("%#v\n",A) fmt.Printf("%#v\n",B) }
|
当源切片比目的切片元素少时复制
1 2 3 4 5 6 7 8 9 10
| func main() { A := []string{"a", "b", "c"} B := []string{"x", "y"}
copy(A, B) fmt.Printf("%#v\n", A) fmt.Printf("%#v\n", B) }
|