(golang)切片何时会创建新切片或影响原切片

慈云数据 2024-03-13 技术支持 48 0

什么时候切片操作会影响原切片

// 1.切片后没有触发slice的扩容机制时

什么时候对切片操作会创建新切片不影响原切片

// 2.对切片头元素进行截取的时候

// 3.当使用append时,len > cap则会触发扩容机制

前置:

//slice结构体
type SliceHeader struct {
	Data unsafe.Pointer // 指向底层数组指针
	Len  int    // 切片的长度
	Cap  int    // 切片的容量
}

代码

package main
import (
	"fmt"
	"reflect"
	"unsafe"
)
// 什么时候切片操作会影响原切片
// case1.切片后没有触发slice的扩容机制时
// 什么时候对切片操作会创建新切片不影响原切片
// case2.对切片头元素进行截取的时候
// case3.当使用append时,len > cap则会触发扩容机制
func main() {
	s := make([]int, 5)
	case1(s)
	PrintSliceStruct(&s)
	case2(s)
	PrintSliceStruct(&s)
	case3(s)
	PrintSliceStruct(&s)
}
func case1(s []int) { //没有触发slice扩容,原切片值发生了变化
	s[1] = 1
	PrintSliceStruct(&s)
}
func case2(s []int) { //此时截取了切片第二个元素,unsafe.pointer发生变化,创建新切片
	s = s[1:2]
	PrintSliceStruct(&s)
}
// 追加元素后,len > cap切片触发扩容机制
func case3(s []int) {
	s = append(s, 0) // 往原切片追加元s素0,此时len为5+1,cap为5,len >cap,触发扩容
	s[1] = 1
	PrintSliceStruct(&s)
}
func PrintSliceStruct(s *[]int) {
	ss := (*reflect.SliceHeader)(unsafe.Pointer(s))
	fmt.Printf("slice struct: %+v, slice is %v\n", ss, *s)
}

输出结果

在这里插入图片描述

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon