【Go】29、go语言切片元素的添加和删除

  • 切片是一个动态数组,可以使用append()函数添加元素,go语言中并没有删除切片元素的专用方法,我们可以使用切片本身的也行来删除元素。由于,切片是引用类型,通过赋值的方式,会修改原有内容,go提供了copy()函数来拷贝切片
1、判断切片是否为空
  • 要检查切片是否为空,请始终使用len(s)==0来判断,而不应该使用s == nil来判断
func f1() {
	var s1 []int

	fmt.Printf("s1: %v\n", s1)
	fmt.Printf("len(s1): %v\n", len(s1))
	fmt.Printf("s1 == nil:%v\n", s1 == nil)

	fmt.Println("===================")

	s2 := []int{}
	fmt.Printf("s2: %v\n", s2)
	fmt.Printf("len(s2): %v\n", len(s2))
	fmt.Printf("s2==nil:%v\n", s2 == nil)

	s3 := make([]int, 0)
	fmt.Printf("s3: %v\n", s3)
	fmt.Printf("len(s3): %v\n", len(s3))
	fmt.Printf("(s3 == nil): %v\n", (s3 == nil))
}

func main() {
	f1()
}
# 输出结果:
    s1: []
    len(s1): 0
    s1 == nil:true
    ===================
    s2: []
    len(s2): 0
    s2==nil:false
    ===================
    s3: []
    len(s3): 0
    (s3 == nil): false
2、切片不能直接比较
  • 切片之间是不能比较的,我们不能使用==操作符来判断两个切片是否含有全部相等元素。 切片唯一合法的比较操作是和nil比较。 一个nil值的切片并没有底层数组,一个nil值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil,例如下面的示例:
var s1 []int         //len(s1)=0;cap(s1)=0;s1==nil
s2 := []int{}        //len(s2)=0;cap(s2)=0;s2!=nil
s3 := make([]int, 0) //len(s3)=0;cap(s3)=0;s3!=nil
  • 所以要判断一个切片是否是空的,要是用len(s)==来判断,不应该使用s==nil来判断
3、append函数常见操作
  • 将切片b的元素添加到切片a之后
a = append(a, b...)
  • 复制切片a的元素到新的切片b上
b = make([]T, len(a))
copy(b, a)
  • 删除位于索引i的元素
a = append(a[:i], a[i+1:]...)
  • 切除切片a中从索引i到j位置的元素:
a = append(a[:i], a[j:]...)
  • 为切片a扩展j个元素长度:
a = append(a, make([]T, j)...)
  • 在索引i的位置插入元素x:
a = append(a[:i], append([]T{x}, a[i:]...)...)
  • 在索引i的位置插入长度为j的新切片
a = append(a[:i], append(make([]T, j), a[i:]...)...)
  • 在索引i的位置插入切片b的所有元素
a = append(a[:i], append(b, a[i:]...)...)
  • 取出位于切片a最末尾的元素x
x, a = a[len(a)-1], a[:len(a)-1]
  • 将元素x追加到切片a
a = append(a, x)
package main

import "fmt"

func f1() {
	// 将切片b的元素添加到切片c之后
	// 定义数组
	a := [...]int{1, 3, 5, 7, 9}
	// 切片
	b := a[:2] // 1 3
	c := a[3:] // 7 9
	fmt.Printf("b: %v\n", b)
	fmt.Printf("c: %v\n", c)

	c = append(c, b...)
	fmt.Printf("c: %v\n", c)
}

func f2() {
	// 复制切片a的元素到新的切片b上
	var a = []int{1, 2, 4}
	b := make([]int, len(a))
	copy(b, a)
	fmt.Printf("b: %v\n", b)
}

func f3() {
	// 删除位于索引i的元素 i=3
	var a = []int{2, 4, 6, 8, 10, 12}
	a = append(a[:3], a[4:]...)
	fmt.Printf("a: %v\n", a)
}

func f4() {
	// 切除切片a中从索引i到j位置的元素 2-4
	var a = []string{"a", "b", "c", "d", "e", "f", "g", "h"}
	a = append(a[:2], a[5:]...)
	fmt.Printf("a: %v\n", a)
}

func f5() {
	// 在索引i的位置插入元素x i=3 x=100
	a := []int{1, 3, 5, 7, 9, 10}
	a = append(a[:3], append([]int{100}, a[3:]...)...)
	fmt.Printf("a: %v\n", a)
}

func f6() {
	// 在索引i的位置插入长度为j的新切片 i = 2 j = 3
	a := []int{1, 2, 3, 4, 5}
	a = append(a[:2], append(make([]int, 3), a[2:]...)...)
	fmt.Printf("a: %v\n", a)
}

func f7() {
	// 在索引i的位置插入切片b的所有元素 b = []int{100, 200, 300}
	a := []int{1, 2, 3, 4, 5}
	a = append(a[:2], append([]int{100, 200, 300}, a[2:]...)...)
	fmt.Printf("a: %v\n", a)
}

func f8() {
	// 取出位于切片a最末尾的元素x
	a := []int{1, 3, 5, 7, 9, 11, 13}
	x := a[len(a)-2 : len(a)-1]
	fmt.Printf("x: %v\n", x)
}

func f9() {
	// 将元素x追加到切片a
	a := []int{1, 2, 3, 4, 5}
	a = append(a, 10)
	fmt.Printf("a: %v\n", a)
}

func main() {
	f1()
	fmt.Println("========")
	f2()
	fmt.Println("=========")
	f3()
	fmt.Println("=========")
	f4()
	fmt.Println("=========")
	f5()
	fmt.Println("=========")
	f6()
	fmt.Println("=========")
	f7()
	fmt.Println("=========")
	f8()
	fmt.Println("=========")
	f9()
}
# 输出结果:
    b: [1 3]
    c: [7 9]
    c: [7 9 1 3]
    ========
    b: [1 2 4]
    =========
    a: [2 4 6 10 12]
    =========
    a: [a b f g h]
    =========
    a: [1 3 5 100 7 9 10]
    =========
    a: [1 2 0 0 0 3 4 5]
    =========
    a: [1 2 100 200 300 3 4 5]
    =========
    x: [11]
    =========
    a: [1 2 3 4 5 10]
posted @   郭祺迦  阅读(925)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2018-06-28 函数练习题
点击右上角即可分享
微信分享提示