Go 葛朗:切片,然后做

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

我很困惑为什么在第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 := 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

这是我的三个问题:

  • 我是如何操作变量c的,它改变了变量b

  • 如果“a”是地址、指针类型或其他类型,为什么“a”从未更改过

  • 即使b是某事物的地址值,为什么在第68行之后C的值不是

  • [0 0 0 1 2]

    这里还有一张照片

    为什么当我将make更改为普通声明时,每个打印日志都变得有意义了?
    “make”中的秘密也是如此吗?

    切片是对底层数组的引用;你可以把它看作是一个结构 有价值

  • 基础数组中值的起始引用地址
  • 切片引用的数据长度
  • 代码:

    这和我刚刚编辑的一些println代码是一样的

    现在让我们来分解输出

    首先,创建一个长度为5且最大容量为10的数组

    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]