开发者

For a struct vertex, what's the difference between map[int]vertex and map[int]*vertex?

To define a map from int to struct vertex, should I define map[int]vertex or map[int]*vertex? Which one is preferred?

I extended Chickencha's code:

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)
}

The output:

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

From the output, my understanding is, if I want to change the struct member in place, I must use pointer to the struct. But I'm still not sure the underlying reasons. Especially, why I cannot assign to a[0].x?


The main difference is that map[int]vertex stores vertex values and map[int]*vertex stores vertex references (pointers). The output of the following program should help illustrate:

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)
}

Output:

0 0 4 4

The vertex stored in b is modified by the v.x, v.y = 4, 4 line, while the vertex stored in a is not.


The answer to this question is likely to be dependent on how Go maps are implemented. For the current implementation, I would take a look the Go map runtime header, hashmap.h, and code, hashmap.c, files. It's also going to depend on how you use the map e.g. what type and volume of activities against the map, key and element data structures, etc.

To update a vector element value in place, read the vector element value from the map, update the element value, write the updated element value to the map. For example

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)
}

Output:

0 0
1 0
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜