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