什么时候切片操作会影响原切片
// 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) }
输出结果: