要在Go中复制一个片断,获得其内容的深度拷贝,你需要使用内置的 copy()函数,或者创建一个新的空分片,并将第一个分片的所有元素用 append()函数将第一个片断的所有元素添加到其中。由于Go中分片的构建方式,将一个分片分配给另一个分片只能进行浅层复制,如果你想深度克隆分片,就不应该使用它。
拷贝一个分片使用 copy()函数复制一个切片
package main
import "fmt"
func main() {
src := []string{"a", "b", "c"}
dst := make([]string, len(src))
copy(dst, src)
fmt.Printf("source slice: %[1]v, address: %[1]p\n", src)
fmt.Printf("source slice: %[1]v, address: %[1]p\n", dst)
}
输出
source slice: [a b c], address: 0xc000098180
source slice: [a b c], address: 0xc0000981b0
正如你所看到的,我们在src 和dst 分片中得到了两个不同的底层数组地址,这证明我们深度克隆了src 分片。该 copy()函数复制了min(len(dst), len(src)) 元素,所以我们需要使用make([]string, len(src)) 创建与src 相同大小的dst 片断。
复制一个片断,使用 append()函数
package main
import "fmt"
func main() {
src := []string{"a", "b", "c"}
var dst []string
dst = append(dst, src...)
fmt.Printf("source slice: %[1]v, address: %[1]p\n", src)
fmt.Printf("source slice: %[1]v, address: %[1]p\n", dst)
}
输出
source slice: [a b c], address: 0xc000098180
source slice: [a b c], address: 0xc0000981b0
使用函数复制一个片断 append()函数复制一个片断是非常简单的。你只需要定义一个新的空分片,并使用 append()将src 中的所有元素添加到dst slice中。这样,你就得到了一个所有元素都被复制的新片断。
通过分配进行浅层复制
package main
import "fmt"
func main() {
src := []string{"a", "b", "c"}
dst := src
fmt.Printf("source slice: %[1]v, address: %[1]p\n", src)
fmt.Printf("source slice: %[1]v, address: %[1]p\n", dst)
}
输出
source slice: [a b c], address: 0xc000098180
source slice: [a b c], address: 0xc000098180
如果你只是把src slice赋值给新的dst 变量,你会得到一个浅层拷贝,它的底层数组是一样的。当你修改这个副本的内容时,原来的片断也会改变。