map,slice,chan 是引用拷贝;引用拷贝 是 浅拷贝
其余的,都是 值拷贝;值拷贝 是 深拷贝
深浅拷贝的本质区别:
是否真正获取对象实体,而不是引用
深拷贝:
拷贝的是数据本身,创造一个新的对象,并在内存中开辟一个新的内存地址,与原对象是完全独立的,不共享内存,修改新对象时不会影响原对象的值。释放内存时,也没有任何关联。
值拷贝:
接收的是 整个array的值拷贝,所以方法对array中元素的重新赋值不起作用。
package main import "fmt" func modify(a [3]int) { a[0] = 4 fmt.Println("modify",a) // modify [4 2 3] } func main() { a := [3]int{1, 2, 3} modify(a) fmt.Println("main",a) // main [1 2 3] }
浅拷贝:
拷贝的是数据地址,只复制指向的对象的指针,新旧对象的内存地址是一样的,修改一个另一个也会变。释放内存时,同时释放。
引用拷贝:
函数的引用拷贝与原始的引用指向同一个数组,所以对数组中元素的修改,是有效的
package main import "fmt" func modify(s []int) { s[0] = 4 fmt.Println("modify",s) // modify [4 2 3] } func main() { s := []int{1, 2, 3} modify(s) fmt.Println("main",s) // main [4 2 3] }