切片的几点知识

扩容时大小与容量的变化

切片在扩容时,是按容量的2倍数进行扩容的。

package main

import (
	"fmt"
)

func main() {
	var numList []int

	for i := 0; i < 16; i++ {
		numList = append(numList, i)
		fmt.Printf("len: %d, cap: %d, pointer: %p\n", len(numList), cap(numList), numList)
	}
}

输出(注意地址的变化):

len: 1, cap: 1, pointer: 0xc000064090
len: 2, cap: 2, pointer: 0xc0000640d0
len: 3, cap: 4, pointer: 0xc000062140
len: 4, cap: 4, pointer: 0xc000062140
len: 5, cap: 8, pointer: 0xc00007c0c0
len: 6, cap: 8, pointer: 0xc00007c0c0
len: 7, cap: 8, pointer: 0xc00007c0c0
len: 8, cap: 8, pointer: 0xc00007c0c0
len: 9, cap: 16, pointer: 0xc000094080
len: 10, cap: 16, pointer: 0xc000094080
len: 11, cap: 16, pointer: 0xc000094080
len: 12, cap: 16, pointer: 0xc000094080
len: 13, cap: 16, pointer: 0xc000094080
len: 14, cap: 16, pointer: 0xc000094080
len: 15, cap: 16, pointer: 0xc000094080
len: 16, cap: 16, pointer: 0xc000094080

复制切片

原始切片变化时,引用切片也会变化,而复制切片不会变化。

package main

import (
	"fmt"
)

func main() {
	const count = 1000

	srcData := make([]int, count)
	for i := 0; i < count; i++ {
		srcData[i] = i
	}

	refData := srcData

	copyData := make([]int, count)
	copy(copyData, srcData)

	srcData[0] = 999

	fmt.Println(refData[0], copyData[0], copyData[count-1])

	copy(copyData, srcData[4:6])
	fmt.Println(copyData[:5])
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值