对于struct vertex,map [int] vertex和map [int] * vertex之间有什么区别?

时间:2010-06-20 13:46:43

标签: go

要定义从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

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

2 个答案:

答案 0 :(得分:2)

主要区别在于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中的顶点则不是。

答案 1 :(得分:1)

这个问题的答案很可能取决于Go地图的实施方式。对于当前的实现,我将查看Go map运行时标头hashmap.h和代码hashmap.c文件。它还取决于你如何使用地图,例如什么类型和数量的活动对照地图,关键和元素数据结构等。

要更新矢量元素值,请从地图中读取矢量元素值,更新元素值,将更新后的元素值写入地图。例如

package main

type vertex struct {
    x, y int
}

func main() {
    a := make(map[int]vertex)
    a[0] = vertex{0, 0}

    println(a[0].x, a[0].y)
    v0 := a[0]
    v0.x = 1
    a[0] = v0
    println(a[0].x, a[0].y)
}

输出:

0 0
1 0