gpt4 book ai didi

Golang : Slice and make

转载 作者:行者123 更新时间:2023-12-01 22:37:40 24 4
gpt4 key购买 nike

enter image description here
我很困惑为什么在第 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”根本没有改变。所以我认为“追加”乐趣是将 slice “a”的增值元素复制到 slice a的最终索引上。
然后,我看不出我给变量 c = append(a, 2) 的任何机会,它会改变变量 b。
所以这是我的三个问题:
  • 我如何操纵 var c 来改变 var b
  • 如果“a”是地址或指针类型或其他类型,为什么“a”从未更改过。
  • 即使 b 是引用某物的地址值,为什么在第 68 行之后 C 的值不是

  • [0 0 0 0 0 1 2]
    这里还有一张图片 enter image description here
        a := []int{0, 0, 0, 0, 0}
    //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 1]
    b[0]= 0
    c= [0 0 0 0 0 2]
    ///////////////////////////////
    a= [0 0 0 0 0]
    b= [0 0 0 0 0 1]
    b[0]= 0
    c= [0 0 0 0 0 2]
    d= [0 0 0 0 0 2 5]

    Process finished with exit code 0
    为什么当我将 make 更改为正常声明时,每个打印日志都变得有意义?
    那么“make”中的 secret 是什么?

    最佳答案

    slice 是对底层数组的引用;您可以将其视为结构
    有值(value)观

  • 底层数组中值开始的引用地址
  • slice 引用的长度

  • 代码:
    func main() {
    a := make([]int, 5, 10)
    fmt.Println("a=", a)
    fmt.Println("Appending to a store in b")
    b := append(a, 1)
    fmt.Println("b=", b)
    fmt.Println("a=", a)

    fmt.Println("Appending to a store in c")
    c := append(a, 2)
    fmt.Println("a=", a)
    fmt.Println("b=", b)
    fmt.Println("c=", c)

    fmt.Println("Appending to c store in d")
    d := append(c, 5)

    fmt.Println("a=", a)
    fmt.Println("b=", b)
    fmt.Println("c=", c)
    fmt.Println("d=", d)
    }
    这是相同的代码,我刚刚编辑了一些 println(s)
    现在让我们分解输出
    首先,您制作一个长度为 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]
    [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]
    现在您追加到 c 并将 5 添加到底层数组
    [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]
    希望它说清楚:)

    关于Golang : Slice and make,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64002855/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com