Для вершины структуры какая разница между вершиной map [int] и вершиной map [int] *? - PullRequest
3 голосов
/ 20 июня 2010

Чтобы определить карту от int до структурной вершины, я должен определить 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 ]

2 голосов
/ 21 июня 2010

Основное отличие состоит в том, что 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, тогда как вершина, сохраненная внет.

1 голос
/ 20 июня 2010

Ответ на этот вопрос, вероятно, будет зависеть от того, как реализованы карты Go. Для текущей реализации я бы посмотрел заголовок среды выполнения карты Go, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...