Go语言中分片(Slice)的其他使用方式

主要讲解Slice 的定义、设置、复制、删除 操作

主要知识点

  • Slice的定义与初始值
  • 熟悉Slice append 之后 len 和 cap 的增长情况
  • 手工指定 Slice 的 len 和 cap
  • Slice 的 复制操作
  • Slice 的删除操作(从中间、最前端、最后端 删除)

以下为代码示例:

package main

import "fmt"

//输出Slice的各项值
func printSlice(s []int) {
	fmt.Printf("val=%v, len=%d, cap=%d\n",
		s, len(s), cap(s))
}

func sliceOps() {
	fmt.Println("Creating slice")
	var s []int // Slice 在没赋值的情况下 值为  nil

	for i := 0; i < 10; i++ {
		printSlice(s)
		//val=[], len=0, cap=0
		//val=[1], len=1, cap=1
		//val=[1 3], len=2, cap=2
		//val=[1 3 5], len=3, cap=4
		//val=[1 3 5 7], len=4, cap=4
		//val=[1 3 5 7 9], len=5, cap=8
		//val=[1 3 5 7 9 11], len=6, cap=8
		//val=[1 3 5 7 9 11 13], len=7, cap=8
		//val=[1 3 5 7 9 11 13 15], len=8, cap=8
		//val=[1 3 5 7 9 11 13 15 17], len=9, cap=16

		// 此处可以看出 随着不断增加 Slice的 len 会随着值的数量递增
		// 但是 所占空间 一旦满了之后,就会执行翻倍操作
		s = append(s, 2*i+1)
	}
	fmt.Println(s) //[1 3 5 7 9 11 13 15 17 19]

	s1 := []int{2, 4, 6, 8}
	printSlice(s1) //val=[2 4 6 8], len=4, cap=4

	//定义一个长度为16的空Slice
	s2 := make([]int, 16)
	//定义一个长度为16,占用空间cap 为32 的Slice
	s3 := make([]int, 10, 32)
	printSlice(s2) //val=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], len=16, cap=16
	printSlice(s3) //val=[0 0 0 0 0 0 0 0 0 0], len=10, cap=32

	fmt.Println("Copying slice")
	copy(s2, s1)  //将 s1 的值 复制 到 s2 中
	printSlice(s2) //val=[2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 0], len=16, cap=16

	fmt.Println("删除掉中间的元素")
	s2 = append(s2[:3], s2[4:]...) //移除第三个元素
	printSlice(s2) //val=[2 4 6 0 0 0 0 0 0 0 0 0 0 0 0], len=15, cap=16

	fmt.Println("移除第一个元素")
	s2 = s2[1:]
	printSlice(s2) //val=[4 6 0 0 0 0 0 0 0 0 0 0 0 0], len=14, cap=15

	fmt.Println("移除最后一个元素")
	s2 = s2[:len(s2)-1]
	printSlice(s2)  //val=[4 6 0 0 0 0 0 0 0 0 0 0 0], len=13, cap=15
}
func main() {
	sliceOps()
}

猜你喜欢

转载自my.oschina.net/ruoli/blog/1815479