go语言切片slice的增、删、改、查,以及常用的函数
切片slice元素的访问和修改
切片slice是数组array的引用,数组的索引访问元素及修改元素的方式也同样适用于切片,如下实例。
实例
package main
import (
"fmt"
)
func main() {
s := []int{0, 1, 2}
fmt.Println(s[0]) //用索引访问元素
s[0] = 3 //用索引重新赋值,以修改元素
fmt.Println(s)
}
代码输出:
0
[3 1 2]
利用append()函数在切片不同位置添加元素的方法
我们可以用append()函数就可以实现在切片slice的不同位置添加(插入)元素,相比像python一样记住各类的函数,这更重要的是一种编程思想。
实例
func main() {
s := []int{0, 1, 2, 3, 4, 5}
s = append(s, 6, 7) //在s的末尾追加6和7两个元素
fmt.Println(s)
//此时的切片s为[0 1 2 3 4 5 6 7],在此基础上,在s的开始位置添加元素
s = append([]int{-2, -1}, s...)
fmt.Println(s)
//此时切片s为[-2 -1 0 1 2 3 4 5 6 7],在此基础上,在切片的中间位置,0的后面添加元素
s = append(s[:3], append([]int{8, 9}, s[3:]...)...)
fmt.Println(s)
//此时切片s为[-2 -1 0 8 9 1 2 3 4 5 6 7]
}
代码输出:
[0 1 2 3 4 5 6 7]
[-2 -1 0 1 2 3 4 5 6 7]
[-2 -1 0 8 9 1 2 3 4 5 6 7]
go切片删除元素的方法
同样的道理,比起其他计算机语言记住各种各样函数,理解go语言中切片删除元素的方法更重要的是理解其编程思想。
实例
func main() {
s := []int{0, 1, 2, 3, 4, 5}
//删除go切片首尾元素的方法
s = s[1:] //利用切片引用并重新赋值的方法,删除掉首尾元素,如果想删除两个,可以用s=s[2:]
fmt.Println(s) //[1,2,3,4,5]
s = s[0:(len(s) - 1)] //删除末尾的元素
fmt.Println(s) //[1,2,3,4]
//接下来,我们利用append()方法来删除切片中间位置的元素
s = append(s[:1], s[2:]...)
fmt.Println(s) //[1,3,4]
}
sort.Sort()函数,用来为切片排序
func main() {
s0 := []int{1, 0, 3, 2, 6, 5}
sort.Sort(sort.IntSlice(s0)) //int类型切片的排序方法
fmt.Println(s0)
s1 := []string{"b", "a", "c", "D", "A"}
sort.Sort(sort.StringSlice(s1)) //string类型的切片排序方法
fmt.Println(s1)
s2 := []float64{1.0, 1.1, 0.5, 3.2, 2.1} //float64类型切片排序方法
sort.Sort(sort.Float64Slice(s2))
fmt.Println(s2)
//上面的三种方法排序都是正序的算法,即从小到大,下面是倒序排列的算法
sort.Sort(sort.Reverse(sort.IntSlice(s0)))
fmt.Println(s0)
}
代码输出:
[0 1 2 3 5 6]
[A D a b c] //在英文字符中从小到大的排序是[A-Z][a-z]
[0.5 1 1.1 2.1 3.2]
[6 5 3 2 1 0]
copy()函数
copy()函数用来复制切片,这与直接将一个切片赋值给另一个切片有很大的区别。如下实例代码:
func main() {
s0 := []int{1, 0, 3, 2, 6, 5}
s1 := make([]int, len(s0))
s2 := s0
copy(s1, s0)
fmt.Printf("s0的内存地址为%p,s1的内存地址为%p,s2的内存地址为%p \n", &s0, &s1, &s2)
s1[0] = 100
fmt.Printf("s1元素修改后,s1的值为%v, s0的值为%v \n", s1, s0)
s0[0] = 99
fmt.Printf("s0元素修改后,s0的值为%v,s2的值为%v,s1的值为%v \n", s0, s2, s1)
}
代码输出:
s0的内存地址为0xc00xxc060,s1的内存地址为0xc00xxc080,s2的内存地址为0xc00xxc0a0
s1元素修改后,s1的值为[100 0 3 2 6 5], s0的值为[1 0 3 2 6 5]
s0元素修改后,s0的值为[99 0 3 2 6 5],s2的值为[99 0 3 2 6 5],s1的值为[100 0 3 2 6 5]
代码解析
如上代码,不管是用copy函数,还是直接赋值,s0、s1、s2的内存地址都是不一样的,但是通过直接赋值,修改s0的元素,s2会跟着发生变化,而s1并不受此影响。
len()函数
len()函数用来返回切片的长度,前面的章节已经有较为详细的介绍了,有需要了解的可以参考前面的。
cap()函数
cap()函数用来返回切片的容量,前面的章节有具体地介绍cap()容量和len()长度的区别,有兴趣了解的可以参考前面的章节。