gpt4 book ai didi

go - 对于结构顶点,map[int]vertex 和 map[int]*vertex 有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 01:08:04 26 4
gpt4 key购买 nike

要定义一个从 int 到 struct vertex 的映射,我应该定义 map[int]vertex 还是 map[int]*vertex?首选哪一个?

我扩展了 Chickencha 的代码:

package main

type vertex struct {
x, y int
}

func main() {
a := make(map[int]vertex)
b := make(map[int]*vertex)

v := &vertex{0, 0}
a[0] = *v
b[0] = v

v.x, v.y = 4, 4
println(a[0].x, a[0].y, b[0].x, b[0].y)

//a[0].x = 3 // cannot assign to (a[0]).x
//a[0].y = 3 // cannot assign to (a[0]).y
b[0].x = 3
b[0].y = 3
println(a[0].x, a[0].y, b[0].x, b[0].y)

u1 := a[0]
u1.x = 2
u1.y = 2
u2 := b[0]
u2.x = 2
u2.y = 2
println(a[0].x, a[0].y, b[0].x, b[0].y)
}

输出:

0 0 4 4
0 0 3 3
0 0 2 2

从输出来看,我的理解是,如果我想就地更改结构成员,我必须使用指向该结构的指针。但我仍然不确定根本原因。特别是,为什么我不能分配给 a[0].x?

最佳答案

主要区别在于 map[int]vertex 存储顶点值,而 map[int]*vertex 存储顶点引用(指针)。以下程序的输出应该有助于说明:

package main

type vertex struct {
x, y int
}

func main() {
a := make(map[int]vertex)
b := make(map[int]*vertex)

v := &vertex{0, 0}
a[0] = *v
b[0] = v

v.x, v.y = 4, 4
println(a[0].x, a[0].y, b[0].x, b[0].y)
}

输出:

0 0 4 4

存储在 b 中的顶点被 v.x, v.y = 4, 4 行修改,而存储在 a 中的顶点则不是。

关于go - 对于结构顶点,map[int]vertex 和 map[int]*vertex 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3079440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com