本来想着=赋值是否把右值得数据赋予左值,int,float这些肯定是这样的。但是在map,slice用=进行赋值的时候却遇见了一些问题。比如赋予左值之后,修改左值会影响原来的值等等。后来查一些资料,得出一个结论。int,float等基础类型的赋值与C/C++里差别不大,而map,slice等的赋值可以类比指针。当然差别还是有的,自己感受一下就好了
有几个文章可以看看
1.搜索关键字(Go值类型与引用类型)
GO值类型与引用类型 - 我是一条最咸的咸鱼 - 博客园www.cnblogs.com也就是说slice的赋值是把整个结构赋予左值,但是结构里的指针还是指向同样的底层数组。这样感受起来其实还是同一东西,与int等的感受不一样了。
2.slice的一个详细分析。
Go基础系列:Go slice详解www.cnblogs.com这里有个内建函数,copy可以用来进行深拷贝。不会失败,是按两个的最小length来拷的。
len(slice)求的是length
cap(slice)求的是capcity
//SLICE[A:B]
//SLICE[A:B:C]
//其中A表示从SLICE的第几个元素开始切,B控制切片的长度(B-A),C控制切片的容量(C-A),如果没有给定C,则表示切到底层数组的最尾部
//SLICE[A:] // 从A切到最尾部
//SLICE[:B] // 从最开头切到B(不包含B)
//SLICE[:] // 从头切到尾,等价于复制整个SLICE
3.map的真正深度拷贝
func (p *Reporter) cloneTags(tags map[string]string) map[string]string {
cloneTags := make(map[string]string)
for k, v := range tags {
cloneTags[k] = v
}
return cloneTags
}
假如直接=的话,应该是只复制了表层,底层的指针还是指向原来的。假如有修改的话会导致混乱。