go里面的赋值大部分都是值拷贝,除非传入指针;
go和c语言一样,类型都是基于值传递的,想要改变变量的值,只能传递指针。
值拷贝:拷贝内容,会重新开辟一块内存存放数据。比如 A :=“abc”,B :=A 这里是值拷贝,B会开辟一个新的内存地址,A 和 B互不影响;
位拷贝:拷贝地址,指向同一个内存空间,改变任意变量值都会影响其他变量;比如 A:="abc",B :=&A 这里是位拷 变量B实际是一个地址,A和B指向同一块地址空间,需要注意的是:注销一个变量可能会导致另外一个变量变成空指针。
PS:数组和切片的range里面的value是值拷贝,赋值是指针类型赋值,只会赋值最后value的值。例如:
package main
import (
"fmt"
)
func main() {
slice :=[]int{0,1,2,3}
copySlice :=make([]*int,0)
//value是值拷贝,数组循环只是改变了临时变量value的值,所以赋值的地址都是同一个
for _,value :=range slice{
copySlice =append(copySlice,&value)
}
//代码可以修改位
//for i,_ :=range slice{
// copySlice =append(copySlice,&slice[i])
// }
for _,value :=range copySlice{
fmt.Println(*value)//结果都是3
}
}
引申一个就是关于浅拷贝和深拷贝的问题:(关于浅拷贝=位拷贝 || 值拷贝=深拷贝 这个不太确定)
浅拷贝就是把值A完全赋值给另外一个值B,包括地址。浅拷贝存在的问题是:如果初始值A被释放,容易导致后面赋值的B指向不存在的地址,这种情况容易导致程序崩溃。
深拷贝就是会生成另外开辟一个内存空间存放新的值,不存对初始值产生影响。