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()长度的区别,有兴趣了解的可以参考前面的章节。



全栈后端 / go语法 :













Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.