谈一下切片的复制过程。
Go切片分为浅拷贝和深拷贝
浅拷贝
Go切片是由长度、容量、底层数值组成的。浅拷贝就是仅复制切片头(切片指针、长度、容量)
由于切片的底层数组是共享的,因此修改切片元素会影响到其他切片。
// 浅拷贝 方式一
package main
import "fmt"
func main() {
var slice1 []int = []int{1, 2, 3}
slice2 := slice1 // 浅拷贝
slice2[0] = 4
fmt.Println(slice1) // [4 2 3]
}
深拷贝
// 深拷贝 方式一
package main
import "fmt"
func main() {
var slice1 []int = []int{1, 2, 3}
var slice2 []int = make([]int, len(slice1))
copy(slice2, slice1)
slice2[0] = 4
fmt.Println(slice1) // [1 2 3]
}
// 深拷贝 方案二
package main
import "fmt"
func main() {
var slice1 []int = []int{1, 2, 3}
var slice2 []int
slice2 = append(slice2, slice1...)
slice2[0] = 4
fmt.Println(slice1) // [1 2 3]
fmt.Println(slice2) // [4 2 3]
}