我已经将问题简化为我的问题的一个小的可运行示例,如下所示:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
其中提供:
FIRST LIST:
1
b
3
SECOND LIST:
3
3
3
Run Code Online (Sandbox Code Playgroud)
简单的任务是创建main_list一些虚拟结构.真正的问题是创建从值引用(指针)main_list进入second_list.我绝对不希望结构的副本,只需要指向结构的指针/引用main_list.第二个for循环遍历新填充的second_list并且仅显示main_list(3在此示例中)三次的最后一个值.
我希望这个问题与我&x在第一个循环中使用的方式有关.通过这种方式,我得到的所有三个值second_list都是相同的struct实例; 我假设我实际上创建了一个指向for循环迭代器的指针(好像它是一个引用?).所以所有指针都second_list将是第一个循环中引用的最后一项.
问题是:如何x在for循环中指出当时指向的内容?
您x在每次调用时都会添加相同的地址append.
您可以初始化一个新x值并复制该值:
for _, x := range main_list {
x := x
second_list = append(second_list, &x)
}
Run Code Online (Sandbox Code Playgroud)
或者创建一个x直接索引切片的新内容:
for i := range main_list {
x := main_list[i]
second_list = append(second_list, &x)
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您想要切片中原始值的地址,您可以使用:
for i := range main_list {
second_list = append(second_list, &main_list[i])
}
Run Code Online (Sandbox Code Playgroud)