2010-06-20 41 views
3

要定义从int到结构顶点的映射,我应该定义map[int]vertex还是map[int]*vertex?哪一个是首选?对于一个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 

从输出中,我的理解是,如果我想改变的地方struct成员,我必须用指针结构。 但我仍然不确定潜在的原因。特别是,为什么我不能分配给[0] .x?

回答

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线改性,而存储在顶点不是。

+0

'map [int] vertex'存储一个值,'map [int] * vertex'存储map元素的指针。在Go中,切片,地图和频道是参考类型。 – peterSO 2010-06-20 22:07:52

+0

对,我想我的措辞可能一直不清楚。我会编辑它,希望它能说明我的意思。 – 2010-06-21 02:13:12

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