메소드를 테스트하려고합니다. 그 서명은 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는 포인터가 아닙니다.
완전한 예제를 보여줍니다. 그냥 추측 : 당신의'Update' 메쏘드는 맵 내용을 수정합니다. 맵과 슬라이스가 "참조 유형"처럼 행동 할 때 ** 포인터를 건네주지 않아도 가능합니다. – Volker
@Volker 많은 것을 설명하고 답을 만들 것입니다. 문서에 대한 링크가 도움이 될 것입니다. 명세는 밝지 만 그것에 관한 어떠한 추측도 찾을 수 없습니다 (예 :지도 https://golang.org/ref/spec#Map_types). – themihai
https://golang.org/doc/faq#references를 참조하십시오. 스펙의 맵 유형에 대한 설명은 지나치게 길지 않습니다. 맵 요소는지도의 요소 일 뿐이며 맵 자체가 아닙니다. 슬라이스의 요소가 슬라이스의 요소이고 슬라이스 자체는 아닙니다. . 따라서 슬라이스 요소의 값이 슬라이스 자체가 변경되지 않고 변경되는 것처럼 실행 중에지도의 내용이 변경 될 수 있습니다. – Volker