GO语言入门-切片的基础和本质

GO语言入门-切片的基础和本质

1、为什么使用切片

- 数组的容量固定,不能自动拓展
值传递,数组作为参数参数时,将整个的数值拷贝一份给形参。
在GO语言当中,我们几乎可以在所有的场景中,使用切片替换数组。

2、切片的本质

不是一个数组的指针,是一种数据结构体,用来操作数组内部元素。  /runtime/slice.go
  • 切片的结构如下:
type slice struct{
    	 *p
   	 len
    	cap
    }

3、切片的使用

切片名称[low:high:max]

  • low: 起始下标位置
  • high: 结束下标位置
  • 容量:cap = max - low

参考示例:

func main() {
	arr := [8] int{1, 2, 3, 4, 5, 6, 7, 8}

	s := arr[1:3:5]
	fmt.Println("s = ", s)
	fmt.Println("len(s) = ", len(s))
	fmt.Println("cap(s) = ", cap(s))

	s2 := s[0:3]
	fmt.Println("s2 = ", s2)
	fmt.Println("len(s2) = ", len(s2))
	fmt.Println("cap(s2) = ", cap(s2))
}

运行输出:

s =  [2 3]
len(s) =  2
cap(s) =  4
s2 =  [2 3 4]
len(s2) =  3
cap(s2) =  4

说明:截取数组 初始化切片时,没有指定切片容量时,切片容量跟随原数组(切片)

4、切片的创建

1、自动推导类型创建切片
slice := [] int{1,2,3,4}
2、make方式创建
slice :=make([]int,长度,容量)
3、make创建
slice := make([]int,长度)当容量为空时,容量=长度

5、append函数

在切片尾部追加数据

func appends() {
	arr := [] int{1, 2, 3, 4, 5, 6, 7, 8}
	arr = append(arr, 22)
	arr = append(arr, 33)
	arr = append(arr, 44)
	arr = append(arr, 55)
	arr = append(arr, 66)
	fmt.Println("arr is ", arr)
}

输入结果:
arr is [1 2 3 4 5 6 7 8 22 33 44 55 66]
注:向切片增加元素时,切片的容量会自动增长。1024一下时,以两倍方式增长

6、copy函数

- 函数copy在两个slice之间复制数据,复制长度以len小的为准,两个slice指向同一地层数组,直接对应位置覆盖。

copy(目标位置切片,原切片)

func copyTest() {
	arr := [] int{0, 1, 2, 3, 4, 5, 6, 7, 8}
	s1 := arr[7:]
	s2 := arr[:2]
	copy(s2, s1)
	fmt.Println("arr is ", arr)
	fmt.Println("s2 is ", s2)
}

输入结果如下:

arr is  [7 8 2 3 4 5 6 7 8]
s2 is  [7 8]
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页