我已经将问题简化为我的问题的一个小的可运行的例子,如下所示:
package main
import "fmt"
type A struct {
Name string
}
func main() {
main_list := []A{A{"1"}, A{"b"}, A{"3"}}
second_list := make([]*A, 0)
fmt.Println("FIRST LIST:")
for _, x := range main_list {
fmt.Println(x.Name)
second_list = append(second_list, &x)
}
fmt.Println("SECOND LIST:")
for _, x := range second_list {
fmt.Println((*x).Name)
}
}
提供:
FIRST LIST:
1
b
3
SECOND LIST:
3
3
3
简单的任务是使用一些虚拟结构创建main_list
。真正的问题是从main_list
中的值到second_list
创建引用(指针)。 我绝对不想要结构的副本,只需要指向main_list
结构的指针/引用。第二个for循环遍历新填充的second_list
,并且仅显示main_list
(此示例中为3
)的最后一个值三次。
我希望问题与我在第一个循环中使用&x
的方式有关。通过这种方式,我将second_list
的所有三个值都设置为相同的结构实例;我将假设我实际上创建了一个指向for循环迭代器的指针(就好像它是一个引用?)。因此second_list
中的所有指针将始终是第一个循环中引用的最后一项。
问题:如何在for循环中指出当前x
指向的内容?
答案 0 :(得分:5)
您在x
的每次通话中都会添加相同append
的地址。
您可以初始化新的x
并复制值:
for _, x := range main_list {
x := x
second_list = append(second_list, &x)
}
或者创建一个新的x
直接索引切片:
for i := range main_list {
x := main_list[i]
second_list = append(second_list, &x)
}
或者,如果您想要切片中原始值的地址,可以使用:
for i := range main_list {
second_list = append(second_list, &main_list[i])
}