gpt4 book ai didi

go - 将 slice 传递给函数

转载 作者:IT王子 更新时间:2023-10-29 01:38:22 24 4
gpt4 key购买 nike

我对传递 slice 的功能有些困惑。这是我读到的内容:

enter image description here

以下是我的理解:slice是一个结构体,带有指向真实数据的指针;当我们将一个 slice 传递给一个函数时,我们只是复制一个指针,但该函数正在使用与原始函数相同的数据。

这是我的代码:

type Example struct {
A int
B string
}

func foo(d []Example) {
for _, e := range d {
e.B = "bye"
}
}

func main() {

a := Example{}
a.A = 10
a.B = "hello"

b := Example{}
b.A = 10
b.B = "hello"

var c []Example
c = append(c, a)
c = append(c, b)

foo(c)

for _, e := range c {
fmt.Println(e.B)
}
}

我已将结构 slice 传递给函数并更改了函数中的结构。为什么我在 main 函数中有旧值?

最佳答案

因为它是一片结构,而不是一片指向结构的指针。当你执行时:

for _, e := range d

在循环内部,e 是 slice 中元素的副本;修改它不会修改 slice 中的内容。如果 d 是一个 []*Example,它将按您的预期工作:https://play.golang.org/p/4ZgLETpq6d0

请特别注意,这与 slice 完全无关。如果是:

func foo(d Example) {
d.B = "bye"
}

您会遇到同样的问题:函数正在修改结构的副本,因此调用者的副本不受函数内部发生的事情的影响。

另一种不使用指针的潜在解决方案是修改 slice 内的值,而不是在元素的副本中:

func foo(d []Example) {
for i := range d {
d[i].B = "bye"
}
}

此样式的工作示例:https://play.golang.org/p/_UJGU0XqaUO

关于go - 将 slice 传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48119275/

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