pointers - Go中的指针困惑

标签 pointers go

我很难理解下面的代码,虽然可以正常工作,但仍然不明白。
如果有人可以揭开它的神秘面纱,那将真的很有帮助

在下面的代码中,标记名称未更新为“已更改”。

package main

import "fmt"

type Command struct {
   Name  string
   Flags []Flag
}

type Flag struct {
   Name      string
   Shorthand string
}

func getCommand() *Command {
   return &Command{Name: "Hello", Flags: []Flag{{"version", "v"}}}
}

func change(cmd *Command) {
   for _, flg := range cmd.Flags {
       flg.Name = "Changed"
   }

}

func main() {
   cmd := getCommand()
   change(cmd)
   fmt.Println(cmd.Flags[0])

}


正确的代码。标志名称更改为“已更改”
package main

import "fmt"

type Command struct {
    Name  string
    Flags []*Flag
}

type Flag struct {
    Name      string
    Shorthand string
}

func getCommand() *Command {
    return &Command{Name: "Hello", Flags: []*Flag{{"version", "v"}}}
}

func change(cmd *Command) {
    for _, flg := range cmd.Flags {
        flg.Name = "Changed"
    }

}

func main() {
    cmd := getCommand()
    change(cmd)
    fmt.Println(cmd.Flags[0])

}


我敢肯定,我的困惑可能微不足道,但这浪费了我几个小时

最佳答案

在您的第一个版本中,当您这样做时:

for _, flg := range cmd.Flags {
    flg.Name = "Changed"
}
flgFlag类型的局部变量。在for循环的每次迭代中,rangeflg设置为cmd.Flags中下一项的副本。因此,当您更改它时,该循环之外没有任何更改。

在第二个版本中,当您执行该循环时,flg*Flag类型的局部变量,因此当range将其设置为cmd.Flags中下一个项目的副本时,flg指向您要进行突变的数据,并对其进行突变。实际更改该数据。

关于pointers - Go中的指针困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60979632/

相关文章:

go - 如何覆盖 func (l *Logger) Println(v ...interface{}) 方法 golang?

go - 如何理解以下代码中的 "ch=ch1"?

c - 从链表中删除某些数字(递归)

c++ - 创建一个 const char* const* 数组

c++ - 将整数转换为 C++ 中的字符指针,然后将其附加到另一个字符指针

go - 随着项目变大,如何组织处理程序?

c++ - 二维 HashMap : A matrix where row and column types are pointers

c - 结构指针?出了点问题

Go Flush() 不起作用

go - 为什么这个 Golang 代码会泄漏内存中变量的值