2014-11-18 6 views
0

메소드를 테스트하려고합니다. 그 서명은 func (gv *myType) Update(all map[string][]SomeType) error왜지도 값이 포인터가 아니더라도 변경되는 이유 - Golang

이지만 예상치는받은 값과 일치하지 않지만 메소드가 평가 된 후 (allSub)받은지도도 "업데이트"되었음을 알았습니다. 당신이 t.Logf("allsub %v", allSub)에서 볼 수 있듯이

t.Logf("allsub %v", allSub) 
if err := gv.Update(allSub); err != nil { 
    t.Error(err) 
    return 
} 
if !reflect.DeepEqual(egv, gv) { 
    t.Errorf("allSub %v", allSub) 
    return 
} 

출력

mth_test.go:265: allsub map[b:[{1 3 3}] a:[{1 0 0} {1 2 0}]] 
mth_test.go:271: allSub map[a:[{1 2 0}]] 

우리가 map[b:[{1 3 3}] a:[{1 0 0} {1 2 0}]]을 다음 평가 후 if !reflect.DeepEqual(egv, gv) allSub가 allSub map[a:[{1 2 0}]]된다 : 여기에 코드입니다. 이것은 나를 미치게하고 나는 이것이 어떻게 가능한가 궁금해하고 있습니까? allSub는 포인터가 아닙니다.

+0

완전한 예제를 보여줍니다. 그냥 추측 : 당신의'Update' 메쏘드는 맵 내용을 수정합니다. 맵과 슬라이스가 "참조 유형"처럼 행동 할 때 ** 포인터를 건네주지 않아도 가능합니다. – Volker

+0

@Volker 많은 것을 설명하고 답을 만들 것입니다. 문서에 대한 링크가 도움이 될 것입니다. 명세는 밝지 만 그것에 관한 어떠한 추측도 찾을 수 없습니다 (예 :지도 https://golang.org/ref/spec#Map_types). – themihai

+1

https://golang.org/doc/faq#references를 참조하십시오. 스펙의 맵 유형에 대한 설명은 지나치게 길지 않습니다. 맵 요소는지도의 요소 일 뿐이며 맵 자체가 아닙니다. 슬라이스의 요소가 슬라이스의 요소이고 슬라이스 자체는 아닙니다. . 따라서 슬라이스 요소의 값이 슬라이스 자체가 변경되지 않고 변경되는 것처럼 실행 중에지도의 내용이 변경 될 수 있습니다. – Volker

답변

0

지도, 조각, 채널은 참조 유형입니다. 스펙은 이에 대해 명확 해지기 위해 진행 중이지만 기본적으로 이러한 내장 유형의 구현은 기본 데이터 구조에 대한 참조를 수반합니다.

따라서 map 유형의 객체는 실제로 연관 배열에 대한 참조라고 생각할 수 있습니다. https://golang.org/doc/effective_go.html#maps

내가 인용 :

효과적인 이동 거기에 약간의 단락을 가지고

조각처럼

,지도는 기본 데이터 구조에 대한 참조를 누릅니다. 지도의 내용을 변경하는 함수에지도를 전달하면 변경 내용이 호출자에게 표시됩니다.

관련 문제