4.9.1切片的复制和删除
- copy
我们定义两个函数,分别不同长度的元素
nums01 := []int{1,2,3}
nums02 := []int{10,20,30,40,50}
切片的复制使用copy。我们将nums01复制到nums02.
在copy中,目标在后。复制的源在前
copy(nums02,nums01)
而后打印nums02
fmt.Println(nums02)
运行
[root@www.linuxea.com /opt/Golang/work2]# go run make7.go
[1 2 3 40 50]
nums01的三个元素复制到nums02,而nums02的后两个元素没有变。
nums2长,而nums01短,假如此时nums02复制到nums01会怎么样。如下:
package main
import "fmt"
func main(){
nums01 := []int{1,2,3}
nums02 := []int{10,20,30,40,50}
copy(nums01,nums02)
fmt.Println(nums01)
}
运行
[root@www.linuxea.com /opt/Golang/work2]# go run make7.go
[10 20 30]
得到的结果是10,20,30。这是因为nums01只有三个元素,nums02复制到nums01也只复制了三个。这也就完成了删除操作。nums02删除掉了40和50的元素。
- copy删除
删除第一个元素和最后一个元素。我们使用切片操作。
- 开始删除第一个
nums06[1:]
[root@www.linuxea.com /opt/Golang/work2]# cat make8.go
package main
import "fmt"
func main(){
nums06 := []int{1,2,3,4,5}
fmt.Println(nums06[1:])
}
运行
[root@www.linuxea.com /opt/Golang/work2]# go run make8.go
[2 3 4 5]
- 开始删除最后一个
nums06[:len(nums06)-1]
。nums06的长度减一
[root@www.linuxea.com /opt/Golang/work2]# cat make8.go
package main
import "fmt"
func main(){
nums06 := []int{1,2,3,4,5}
fmt.Println(nums06[1:])
fmt.Println(nums06[:len(nums06)-1])
}
运行
[root@www.linuxea.com /opt/Golang/work2]# go run make8.go
[2 3 4 5]
[1 2 3 4]
- 删除中间的元素
使用copy来进行删除3。如下:
nums06 := []int{1,2,3,4,5}
或许索引2到结尾,和3到结尾的
fmt.Println(nums06[2:])
fmt.Println(nums06[3:])
分别结果是[3 4 5]
和[4 5]
而后,在将nums06[3:] copy到nums06[2:]
copy(nums06[2:],nums06[3:])
如下图:
如上图,索引3到结尾的值是4和5,copy到索引3结尾是3,4,5,结果就变成了[1 2 4 5 5]
copy(nums06[2:],nums06[3:])
fmt.Println(nums06)
而后在去掉最后一位,就变成了1,2,4,5
fmt.Println(nums06[:len(nums06)-1])
[1 2 4 5]
代码块如下:
[root@www.linuxea.com /opt/Golang/work2]# cat make8.go
package main
import "fmt"
func main(){
nums06 := []int{1,2,3,4,5}
fmt.Println(nums06)
fmt.Println(nums06[2:])
fmt.Println(nums06[3:])
copy(nums06[2:],nums06[3:])
fmt.Println(nums06)
fmt.Println(nums06[:len(nums06)-1])
}
运行
[root@www.linuxea.com /opt/Golang/work2]# go run make8.go
[1 2 3 4 5]
[3 4 5]
[4 5]
[1 2 4 5 5]
[1 2 4 5]
3删除成功。
4.9.2切片的应用
- a) 队列,先进先出
从后面进行追加,移除的时候从前面开始移除
[root@DT_Node-172_17_0_1 /opt/Golang/work2]# cat dmake4.go
package main
import "fmt"
func main(){
queue := []int{}
queue = append(queue,1,3,2)
fmt.Println("queue:",queue)
fmt.Println(queue[0])
queue = queue[1:]
fmt.Println(queue[0])
queue = queue[1:]
fmt.Println(queue[0])
queue = queue[1:]
}
运行
[root@DT_Node-172_17_0_1 /opt/Golang/work2]# go run dmake4.go
queue: [1 3 2]
1
3
2
- b) 堆栈,先进后出
添加的时候往后添加,移除的时候也从后面移除。
[root@DT_Node-172_17_0_1 /opt/Golang/work2]# cat dmake5.go
package main
import "fmt"
func main(){
stack := []int{}
stack = append(stack,1,3,2)
fmt.Println("stack:",stack)
fmt.Println(stack[len(stack) -1])
stack = stack[:len(stack)-1]
fmt.Println(stack[len(stack)-1])
stack = stack[:len(stack)-1]
fmt.Println(stack[len(stack)-1])
}
运行
[root@DT_Node-172_17_0_1 /opt/Golang/work2]# go run dmake5.go
stack: [1 3 2]
2
3
1