使用指针将列表复制到列表

jak*_*451 1 go

我已经将问题简化为我的问题的一个小的可运行示例,如下所示:

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循环中指出当时指向的内容?

Jim*_*imB 5

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)