linuxea:go切片复制和删除与应用(25)

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
0 分享

您可以选择一种方式赞助本站

支付宝扫码赞助

支付宝扫码赞助

日期: 2019-12-29分类: Golang

标签: Golang

发表评论