为了账号安全,请及时绑定邮箱和手机立即绑定

golang中数组的子集

golang中数组的子集

Go
吃鸡游戏 2021-09-13 10:39:15
我正在尝试在 python 中编写等效于以下行的内容H = [e for e in G if condition(e)]这是我的示例代码。基本上我只是想使用 getter 函数 (G.get) 来获取G. 所以我想我想arr2成为一个新的数组,但包含相同的对象。package mainimport "fmt"type Object struct {    x int}type Group []Objectfunc (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应该吗?
查看完整描述

1 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

这个更简单的代码片段显示了发生了什么:


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}


该语句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 []*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


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 267 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信