gpt4 book ai didi

pointers - Go中的指针困惑

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

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

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

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/

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