什么时候切片操作会影响原切片
// 1.切片后没有触发slice的扩容机制时
什么时候对切片操作会创建新切片不影响原切片
// 2.对切片头元素进行截取的时候
// 3.当使用append时,len > cap则会触发扩容机制
前置:
//slice结构体
type SliceHeader struct {Data unsafe.Pointer // 指向底层数组的指针Len int // 切片的长度Cap int // 切片的容量
}
代码:
package mainimport ("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] = 1PrintSliceStruct(&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] = 1PrintSliceStruct(&s)
}func PrintSliceStruct(s *[]int) {ss := (*reflect.SliceHeader)(unsafe.Pointer(s))fmt.Printf("slice struct: %+v, slice is %v\n", ss, *s)
}
输出结果: