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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Julywhj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值