【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]
本文来自博客园,作者:郭祺迦,转载请注明原文链接:https://www.cnblogs.com/guojie-guojie/p/16418424.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2018-06-28 函数练习题