golang 中数组的子集

subset of array in golang

我正在尝试在 python

中编写与以下行等效的内容

H = [e for e in G if condition(e)]

这是我的示例代码。基本上我只是尝试使用 getter 函数 (G.get) 来获取 G 的子集。所以我想我希望 arr2 成为一个新数组但包含相同的对象。

package main

import "fmt"

type Object struct {
    x int
}

type Group []Object

func (G *Group) get() (H []Object) {
    for _,v := range *G {
        H = append(H,v)
    }
    return
}

func main() {
    arr := make(Group,1)
    arr[0].x = 1
    fmt.Println(arr)
    arr2 := arr.get()
    arr[0].x = 3
    fmt.Println(arr)
    fmt.Println(arr2)
}

它编译并运行并给我

[{1}]
[{3}]
[{1}]

我的问题是 "Why does arr2 not contain the same instance of an Object as arr?" 我相信我理解 make 只实例化一个 Group 东西,这意味着它包含一个 Object。但是 for 循环不应该创建一个新的 Object 应该吗?

感谢您的帮助!

这段更简单的代码显示了正在发生的事情:

var a Object
a.x = 1
b := a
fmt.Println(a, b) // prints {1} {1}
b.x = 2
fmt.Println(a, b) // prints {1} {2}

playground example

语句b := a将变量a中的Object值复制到变量b中。现在有两个值的副本。改变一个不会改变另一个。

这与 Python 不同,其中赋值复制对值的引用。

问题中的循环也复制了值:

for _,v := range *G {
    H = append(H,v)
}

变量 v*G 的切片元素的副本。 v 的副本附加到切片 H。有三个独立的Object值:切片*G中的值,v中的值和切片H中的值。

如果您希望切片都引用相同的 Object 值,则在切片中存储指向 Object 值的指针:

type Group []*Object

arr := make(Group, 1)
arr[0] = &Object{x: 1}
fmt.Println(arr[0].x)  // prints 1
arr2 := arr.get()
arr[0].x = 3
fmt.Println(arr[0].x)  // prints 3
fmt.Println(arr2[0].x) // prints 3

playground example