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}
语句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
我正在尝试在 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}
语句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