2016-09-20 3 views
2

여기 내 코드입니다 : 내가지도에 대한 포인터를 test()에지도 값을 전달하고 있지 않다 때문에 나는 지금까지 내가 알고 있었다으로 꽤 이동하는 새로운, 그러나이야한 기능의지도 값이 다른 기능의지도 항목에 영향을받는 이유는 무엇입니까?

func test(v map[string]string) { 
    v["foo"] = "bar" 
} 

func main() { 
    v := make(map[string]string) 
    test(v) 
    fmt.Printf("%v\n", v) // prints map[foo:bar] 
} 

test() 기능 지도의 다른 변수를 수정해야하므로 변수 값에 영향을 미치지 않습니다. main(). 나는 그것이 map[]을 인쇄 할 것으로 예상했을 것입니다. 다른 시나리오를 테스트했습니다.

type myStruct struct { 
    foo int 
} 

func test2(v myStruct) { 
    v.foo = 5 
} 

func main() { 
    v := myStruct{1} 
    test2(v) 
    fmt.Printf("%v\n", v) // prints {1} 
} 

이 시나리오에서 예상대로 코드가 작동합니다. main() 함수의 v 변수는 test2()의 변수 변경으로 영향을받지 않습니다. 그러면지도가 다른 이유는 무엇입니까?

답변

4

함수에 무언가를 전달하면 복사본이 만들어집니다. 그러나 맵은 기본 데이터 구조에 대한 설명 자의 일종입니다. 따라서 함수에 맵 값을 전달할 때, 맵 데이터 (엔트리)가 저장된 동일한 데이터 구조를 가리키거나 가리키는 설명자 만 복사됩니다.

이것은 함수가 호출자로부터 관찰 된 맵 항목 (추가, 삭제, 항목 수정)에 대한 수정을 수행함을 의미합니다.

자세한 내용은 The Go Blog: Go maps in action을 참조하십시오.

sliceschannels에도 동일하게 적용됩니다. 일반적으로 내장형 make() 기능을 사용하여 만들 수있는 유형을 말합니다. 이것이 이러한 유형의 zero valuenil 인 이유입니다.이 유형의 값은 make()을 호출 할 때 추가 초기화가 필요하기 때문입니다.

struct 값을 사용하는 다른 예에서는 설명자가 아닙니다. struct 값을 다른 함수에 전달하면 struct 값의 전체 복사본이 만들어지고 (함수의 모든 필드 값이 복사 됨) 함수 내부에서 수정 된 경우 원본의 메모리에 영향을주지 않습니다. 복사본이 수정됩니다 - 어떤 것이 뚜렷합니다.

관련 문제