pointers - Go循环指针变化

标签 pointers go reference slice

我在 Go 中使用 for range 循环来遍历一片结构。

在每个循环中,我将指向当前项目的指针指向一个变量。

我很困惑为什么指针会在下一个循环中改变值。

例如this code :

package main

import "fmt"

type t struct {
    val int
}

func main() {
    l := []t{{1}, {2}}
    var p *t
    for _, i := range l {
        fmt.Println("begin", p)
        p = &i
        fmt.Println("end", p)
    }
}

我希望产生:

begin <nil>
end &{1}
begin &{1}
end &{2}

但实际上确实如此:

begin <nil>
end &{1}
begin &{2}
end &{2}

作为引用,在我的实际代码中,我在循环期间检查条件,并返回当前项目和前一个项目。所以我试图保存一个指向它的指针,以便在下一次迭代中它也可以访问前一次。

最佳答案

问题是您获取的是循环/范围变量的地址,而不是 slice 中项目的地址。但是,您只是在为自己做很多不必要的工作。首先,你为什么不使用 i, v := range 或更好的 i, _ := 然后你可以做 i-1 获取上一项?其次,即使你想把它保存在一个指针中,仍然使用这个语法然后赋值 p = &l[i] 这样你就得到了 slice 中项目的地址而不是循环的地址/范围变量。

当使用索引显然更好时,人们太急于使用 for/each 样式构造...如果您希望每次迭代都使用 index-1,那么使用索引应该是您的首选方式。

关于pointers - Go循环指针变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32401933/

相关文章:

go - Golang 的 Codeclimate 测试覆盖格式化程序

c++ - 引用如何绑定(bind)到纯右值?

c++ - 初始化一个类成员引用变量,就像它是一个常规变量一样

javascript - 从 div 调用 Javascript 函数

c++ - 指向释放变量的指针更改地址

c - 在 C 中,将数组作为 *arr 和 *arr[] 传递给函数有什么区别?

c - 打印函数地址

c - 尝试为结构中的 void 指针赋值

go - golang中如何将日志写入多个日志文件?

macos - `go get` 因某些 go 包的权限被拒绝而失败