七、Golang之切片(slice)

478 阅读2分钟

由于数组的长度是固定的,所以有很多的局限性,所以今天讲切片,切片是一个拥有相同类型且长度可变的有序集合,切片和数组两种不同的数据类型,它是基于数组进行了封装,可扩容

切片的定义

var list []int
//初始化
var list = []int{}
//初始化赋值
var list  = []int{1,2,3}

切片的长度和容量

求切片的长度和容量使用len()方法和cap()方法

使用make 方法初始化切片

make([]T, size, cap)
//申明且初始化一个 长度为5,容量为10,值类型为string 的切片
var list = make([]string,5,10)

切片的拷贝

`直接赋值的两个切片共享的是一个底层数组,修改一个,另一个的值也会改变,如下:`
var list1 = make([]int,3)
list2:=list1
list2[0]=100
fmt.Println(list1)
//[100,0,0]

切片是引用数据类型两个切片指向同一个指针,copy是内置的方法,所以我们使用copy方法来进行切片的拷贝,它可以讲一个切片内容快速拷贝到另一个空间 copy(目标,来源)

var list1 = []int{1,2,3,4,5}
var list2 = make([]int,5)
copy(list2,list1)
list2[0] = 100
fmt.Println(list1) //[1,2,3,4,5]
fmt.Println(list2) //[100,2,3,4,5]

切片的遍历

切片的遍历和数组一样可以使用for 循环

//第一种
var list = []int{1,2,3,4,5}
for i:=0;i<len(list);i++{
    fmt.Println(list[i])
}
//第二种 for range
 for index,value := range list{
     fmt.Println(index,value)
 }

切片添加元素

go内置的append方法可以给切片添加元素

var list []int
list = append(list,1) //[1]

//也可以追加多个元素
list = append(list,1,2,3,4,5) //[1,1,2,3,4,5]

//追加多个另一个切片
var list2 = []int{6,7,8}
list = append(list,list2...) //[1,1,2,3,4,5,6,7,8]

注意:通过var 关键字声明的切片不用初始化也可以使用append

切片删除元素

golang中并没有提供此方法 但是可以根据特性自己去实现

var list = []int{1,2,3,4,5,6}
//删除索引为3的元素
list = append(list[0:3],[3:]...) //[1,2,3,5,6]

要从切片a中删除索引为index的元素,操作方法是a = append(a[:index], a[index+1:]...)

排序

var list = []int{3,4,2,1,5}
var list2 = []string{"d","v","a"}
//正序
sort.Ints(list)
sort.Strings(list2)
//倒序
sort.Sort(sort.Reverse(sort.IntSlice(list)))
sort.Sort(sort.Reverse(sort.StringSlice(list2)))

//或者使用sort.slice 自定义排序
sort.Slice(a, func(i, j int) bool {
  return a[i] > a[j]
})