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

时间:2017-02-06 19:12:49

标签: 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)
    }
}

提供:

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指向的内容?

1 个答案:

答案 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])
}