值拷贝 与 引用拷贝,深拷贝 与 浅拷贝

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]
}