1.什么是深拷贝,什么是浅拷贝
深拷贝才是真正意义上的复制粘贴
值类型的数据,默认全部都是深拷贝:所有integer、所有float、bool、string、数组、structure浅拷贝相当于起了一个别名
引用类型的数据,默认全部都是浅拷贝:指针、slice、map、chan、interface
指针天生是引用,后面几个怎么就是引用的???
slice map chan 本质是结构体,而他们的结构体里面是有带有指针的结构体【不是普通结构体】
interface 的本质也是结构体,而他的结构体里面也有带有指针的结构体【不是普通结构体】
interface 底层又分为 【iface】,【eface】 两种结构体
a1 := [4]int{1, 2, 3, 4}
a2 := a1 //深拷贝
fmt.Println(a1, a2)
a1[0] = 100
fmt.Println(a1, a2) //只影响一个数组
fmt.Printf("%p\n", &a1) //0xc000017300
fmt.Printf("%p\n", &a2) //0xc000017320
s1 := []int{1, 2, 3, 4}
s2 := s1 //浅拷贝
fmt.Println(s1, s2)
s1[0] = 100
fmt.Println(s1, s2) //两个切片数据同时变
fmt.Printf("%p\n", s1) //0xc000017400
fmt.Printf("%p\n", s2) //0xc000017400
2.copy()函数将浅拷贝赋值升级为深拷贝
1.copy 只能用于切片,不能用于 map 等任何其他类型。
2.copy 返回结果为一个 int 型值,表示 copy 从原切片 src 复制到 dst 切片的长度。
3.如果 dst 长度小于 src 的长度,则 拷贝 src 中的部分内容;
4.如果大于,则全部拷贝过来,其余的空间填充该类型的默认值;
5.如果相等,则全部 copy 过来,所以,通常 dst 在初始化时即指定其为src的长度。
package main
import "fmt"
func main() {
src := []int{1, 2, 3, 5, 6, 7, 8}
fmt.Println("src len:", len(src), "src:", src)
dst := make([]int, 0)//相当于只是初始化了dst,再构造了内部结构,长度却为0
copy(dst, src)//深拷贝不过来
fmt.Println("dst len:", len(dst), "dst:", dst)
dst1 := make([]int, len(src)/2)
copy(dst1, src)///深拷贝过来一半
fmt.Println("dst1 len:", len(dst1), "dst1:", dst1)
dst2 := make([]int, len(src))
copy(dst2, src)//深拷贝过来全部
fmt.Println("dst2 len:", len(dst2), "dst2:", dst2)
dst3 := make([]int, len(src)+2)
copy(dst3, src)//深拷贝过来全部,并且还有空位没使用
fmt.Println("dst3 len:", len(dst3), "dst3:", dst3)
}
相关转载自:[blog.csdn.net/Alen_xiaoxi…]