拷贝的方式

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指向不存在的地址,这种情况容易导致程序崩溃。

深拷贝就是会生成另外开辟一个内存空间存放新的值,不存对初始值产生影响。

转载于:https://my.oschina.net/u/3327222/blog/1609201

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值