gpt4 book ai didi

go - 分配给 slice 的值与指针

转载 作者:行者123 更新时间:2023-12-01 22:30:42 25 4
gpt4 key购买 nike

我正在完成这个“Tour of Go”,我正在做这个练习here .我最初是这样写的答案:

func Pic(dx, dy int) [][]uint8 {
outer := make([][]uint8, dy)
inner := make([]uint8, dx)

for y, _ := range outer {
for x, _ := range inner {
inner[x] = x^y // this is one of the image functions they give
}

outer[y] = inner
}
return outer
}
我认为这应该可行,但是当我运行 Pic(5,5)我得到:
[[0 4 8 12 16] [0 4 8 12 16] [0 4 8 12 16] [0 4 8 12 16] [0 4 8 12 16]]
不对,很明显。
所以,我终于发现我需要移动我的 inner := make([]uint8, dx)在第一个循环内声明如下:
func Pic(dx, dy int) [][]uint8 {
outer := make([][]uint8, dy)

for y, _ := range outer {
inner := make([]uint8, dx)

for x, _ := range inner {
inner[x] = x^y // this is one of the image functions they give
}

outer[y] = inner
}
return outer
}
现在 Pic(5,5)给了我正确的答案:
[[0 0 0 0 0] [0 1 2 3 4] [0 2 4 6 8] [0 3 6 9 12] [0 4 8 12 16]]
这里发生了什么事?我认为这与指针或其他东西有关,但我想确定我真的了解发生了什么。显然,在第一个示例中,每次我将新内容重新分配给 inner outer 中的值以前有 inner分配给他们的也发生了变化。
但是在第二个例子中会发生什么?每次我们通过 range outer循环 inner变量被重新声明,但 outer 的值会发生什么变化?以前有 inner分配给他们?它们现在是否以某种方式“被切断”并且仅作为副本存在?
我很困惑,因为赋值行 outer[y] = inner在这两个示例中都没有改变,所以我不明白其中一个如何分配值的副本而在另一个中分配我认为是指针的机制。

最佳答案

在第一种情况下,您永远不会“将新内容重新分配给 inner”。您创建了 uint8 的 slice , 称为 inner ,您填充了值(多次覆盖这些值),并且您制作了 outer 的每个元素包含 inner 的副本.但请记住, slice 只是存在于某处的数组的 View (在您的情况下,支持数组是由 make 匿名创建的)。复制 slice 不会复制数组中的值,它只是复制 slice header ,这意味着现在有多个 View 在同一个存储上(这很好,也很安全)。
在第二种情况下,您调用了 make对于 outer 的每一行,因此创建了五个不同的后备数组,inner每次指向不同的。这一次,当你分配 innerouter 的元素,你得到了五个真正不同的 slice 头,而不是同一个 slice 头的五个副本。
简而言之: slice 是一个值,但它是一个包含指针的值。指针可能指向一个有名字的数组,也可能指向一个完全匿名的数组。没有什么可担心的; Go 将确保任何被指向的东西都保持活力。

关于go - 分配给 slice 的值与指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62764143/

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