猿问

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}]

我的问题是“为什么不arr2包含与 相同的对象实例arr?” 我相信我理解make只实例化一个Group东西,这意味着它包含一个Object东西。但是 for 循环不应该创建一个新的Object应该吗?

吃鸡游戏
浏览 268回答 1
1回答

守候你守候我

这个更简单的代码片段显示了发生了什么:var a Objecta.x = 1b := afmt.Println(a, b) // prints {1} {1}b.x = 2fmt.Println(a, b) // prints {1} {2}该语句b := a将Object变量中的值复制a到变量中b。现在有两个值的副本。改变一个不会改变另一个。这与 Python 不同,在 Python 中赋值复制对值的引用。问题中的循环也复制值:for _,v := range *G {    H = append(H,v)}变量v是切片元素的副本*G。的副本v附加到 slice H。存在三个独立的 Object 值: slice 中的值、 slice*G中的值v和 slice 中的值H。如果您希望切片都引用相同的Object值,则Object在切片中存储指向值的指针:type Group []*Objectarr := make(Group, 1)arr[0] = &Object{x: 1}fmt.Println(arr[0].x)  // prints 1arr2 := arr.get()arr[0].x = 3fmt.Println(arr[0].x)  // prints 3fmt.Println(arr2[0].x) // prints 3
随时随地看视频慕课网APP

相关分类

Go
我要回答