文章目录
GoLang之内置append、copy函数
1.append
1.源码
func append(slice []Type, elems ...Type) []Type
2.用法
3.追加一个元素
4.追加一个切片
5.make创建slice并添加元素
6.删除元素
6.1删除开头三个元素
func main() {
slice1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
slice2 := append(slice1[:0], slice1[3:]...)
fmt.Println(len(slice2))//7
fmt.Println(cap(slice2))//10
fmt.Println(slice2)//[4, 5, 6, 7, 8, 9, 10]
}
6.2删除中间三个元素
func main() {
slice1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
slice2 := append(slice1[:1], slice1[4:]...)
fmt.Println(len(slice2)) //7
fmt.Println(cap(slice2)) //10
fmt.Println(slice2) //[1 5 6 7 8 9 10]
}
6.3删除结尾三个元素
func main() {
slice1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
slice2 := append(slice1[:0], slice1[:7]...)
fmt.Println(len(slice2)) //7
fmt.Println(cap(slice2)) //10
fmt.Println(slice2) //[1 2 3 4 5 6 7]
}
7.在Println函数里可直接输出并不会改变到原slice
func main() {
stack1 := []string{}
fmt.Println(stack1)
name := "aaa"
fmt.Println(append(stack1, name)) //输出[aaa]
fmt.Println(stack1)
}
8.append函数必须有接受值(可以不是原slice)
func main() {
stack1 := []string{}
name := "aaa"
append(stack1, name)//编译错误:必须得有个接受
}
func main() {
stack1 := []string{}
name := "aaa"
stack1 = append(stack1, name)
fmt.Println(stack1)//输出: [aaa]
}
func main() {
stack1 := []int{1, 2}
fmt.Println(stack1) //[1 2]
stack2 := []int{3, 4}
name := 5
stack2 = append(stack1, name) //编译错误:必须得有个接受
fmt.Println(stack2) //[1 2 5]
fmt.Println(stack1) //[1 2]
}
2.copy
2.1源码
返回值是拷贝成功的元素个数
func copy(dst, src []Type) int
2.2大容量赋给小容量
func main() {
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
fmt.Println(len(slice1))//5
fmt.Println(cap(slice1))//5
fmt.Println(len(slice2))//3
fmt.Println(cap(slice2))//3
//复制slice1到slice 2
copy(slice2, slice1) //只会复制slice的前3个元素到slice2中
fmt.Println(len(slice1))//5
fmt.Println(cap(slice1))//5
fmt.Println(len(slice2))//3
fmt.Println(cap(slice2))//3
fmt.Println(slice2)//[1,2,3]
}
2.3小容量赋给大容量`
func main() {
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
fmt.Println(len(slice1)) //5
fmt.Println(cap(slice1)) //5
fmt.Println(len(slice2)) //3
fmt.Println(cap(slice2)) //3
//复制slice2到slice1
copy(slice1, slice2) //只会复制slice2的3个元素到slice1的前3个位置
fmt.Println(len(slice1)) //5
fmt.Println(cap(slice1)) //5
fmt.Println(len(slice2)) //3
fmt.Println(cap(slice2)) //3
fmt.Println(slice1) //[5,4,3,4,5]
}
`
2.4指定范围copy
2.5删除元素
func main() {
slice1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
slice2 := slice1[:copy(slice1, slice1[3:])]
fmt.Println(len(slice1)) //10
fmt.Println(cap(slice1)) //10
fmt.Println(len(slice2)) //7
fmt.Println(cap(slice2)) //10
fmt.Println(slice1) //[4 5 6 7 8 9 10 8 9 10]
fmt.Println(slice2) //[4 5 6 7 8 9 10]
}
3.切割方式删除元素
func main() {
slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println(len(slice)) //10
fmt.Println(cap(slice)) //10
slice = slice[:len(slice)-5] //删除尾部5个元素
fmt.Println(len(slice)) //5
fmt.Println(cap(slice)) //10
fmt.Println(slice) //[1 2 3 4 5]
slice = slice[5:] //删除 头部5个元素
fmt.Println(len(slice)) //0
fmt.Println(cap(slice)) //5
fmt.Println(slice) //[]
}
func main() {
slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println(slice[10])//编译没有问题,但是运行后会抛出索引越界错误
}
func main() {
slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println(slice[10:]) //输出:[]
}