2010-06-20 2 views
3

int에서 struct vertex로 맵을 정의하려면 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 

, 내가 장소에 구조체 멤버를 변경하려는 경우 나의 이해는 내가 포인터를 사용해야한다 구조체. 하지만 여전히 근본적인 이유가 확실하지 않습니다. 특히 [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 선으로 수정을, (A)에 저장된 정점 아니지만.

+0

'map [int] vertex'는 값을 저장하고'map [int] * vertex'는 map 요소의 포인터를 저장합니다. Go에서 슬라이스,지도 및 채널은 참조 유형입니다. – peterSO

+0

맞아요. 내 말씨가 명확하지 않았을 수도 있습니다. 나는 그것이 의미하는 바를 말하기를 바란다. –

1

이 질문에 대한 답변은 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 
관련 문제