Go 葛朗:切片,然后做
我很困惑为什么在第68行之后,b也改变了。我打算假设,当涉及到第64行时,变量b被设置为引用“a”的内存地址Go 葛朗:切片,然后做,go,slice,Go,Slice,我很困惑为什么在第68行之后,b也改变了。我打算假设,当涉及到第64行时,变量b被设置为引用“a”的内存地址 a := make([]int, 5, 10) fmt.Println("a=", a) b := append(a, 1) fmt.Println("000000000000000000000000") fmt.Println("b=", b) fmt.Println("a=", a) c := appen
a := make([]int, 5, 10)
fmt.Println("a=", a)
b := append(a, 1)
fmt.Println("000000000000000000000000")
fmt.Println("b=", b)
fmt.Println("a=", a)
c := append(a, 2)
fmt.Println("------------------------------")
fmt.Println("a=", a)
fmt.Println("b=", b)
fmt.Println("b[0]=", b[0])
fmt.Println("c=", c)
d := append(c, 5)
fmt.Println("///////////////////////////////")
fmt.Println("a=", a)
fmt.Println("b=", b)
fmt.Println("b[0]=", b[0])
fmt.Println("c=", c)
fmt.Println("d=", d)
-------------terminal------------------------
------------------------------------
a= [0 0 0 0 0]
000000000000000000000000
b= [0 0 0 0 0 1]
a= [0 0 0 0 0]
------------------------------
a= [0 0 0 0 0]
b= [0 0 0 0 0 2]
b[0]= 0
c= [0 0 0 0 0 2]
///////////////////////////////
a= [0 0 0 0 0]
b= [0 0 0 0 0 2]
b[0]= 0
c= [0 0 0 0 0 2]
d= [0 0 0 0 0 2 5]
Process finished with exit code 0
其中,我特别打印了“a”,以查看a是否已更改
如您所见,变量“a”根本没有改变。所以我认为“append”fun将把slice“a”的增值元素复制到slice a的最终索引上
然后,我看不出有任何可能,我给变量c=append(a,2),它会改变变量b
这是我的三个问题:
“make”中的秘密也是如此吗?切片是对底层数组的引用;你可以把它看作是一个结构 有价值
a= [0 0 0 0 0]
这是长度为5的预期数组
现在将1附加到a并存储在b中
意味着基础数组现在是
[0, 0, 0, 0, 0, 1]
|-------------| This part is referenced by a
|----------------| This part is referenced by b
所以当你打印时,这就是你得到的准确输出
Appending to a store in b
b= [0 0 0 0 0 1]
a= [0 0 0 0 0]
现在,在下一部分中,您将附加到a,现在记住a只引用基础数组中的5个值,所以当您附加到a并存储在c中时,它将更新基础数组索引5并覆盖它
以前
[0,0,0,0,0,1]
之后
现在您将附加到c,它将5添加到基础数组中
以前
之后
希望它能让你明白:)不要发布代码的图片;编辑您的问题并添加代码here@ShubhamSrivastava编辑。谢谢带着Go之旅,阅读slice的博客文章。我很抱歉我没有在你提到[0,0,0,0,0,1]|--------------------这部分被a引用了|--------------------这部分被b引用了为什么[0,0,0,0,0,0,1]被a引用了,我仍然打印a,它是[0,0,0,0]下面有同样的问题。谢谢again@Eien_ZhengYC_它格式错误,我会修正的that@Eien_ZhengYC_现在可以理解了吗?你只需要理解切片的工作是指向数组的一部分的起点和终点,它通过包含起始位置的引用和从该位置开始的长度来实现这一点,现在更好了~让我想想
Appending to a store in b
b= [0 0 0 0 0 1]
a= [0 0 0 0 0]
[0,0,0,0,0,1]
[0, 0, 0, 0, 0, 2]
|-------------| This part is referenced by a
|----------------| This part is referenced by b
|----------------| This part is referenced by c
Appending to a store in c
a= [0 0 0 0 0]
b= [0 0 0 0 0 2]
c= [0 0 0 0 0 2]
[0, 0, 0, 0, 0, 2]
[0, 0, 0, 0, 0, 2, 5]
|-------------| This part is referenced by a
|----------------| This part is referenced by b
|----------------| This part is referenced by c
|-------------------| This part is referenced by d
Appending to c store in d
a= [0 0 0 0 0]
b= [0 0 0 0 0 2]
c= [0 0 0 0 0 2]
d= [0 0 0 0 0 2 5]