2016-08-23 3 views
2

나는 꽤 골란에 익숙하지 않고 일반적으로 언어를 컴파일 했으므로 내 무지를 용서해주십시오. 이와 같은 일부 코드 : 변수 할당과 참조 전달의 차이점은 무엇입니까?

package main 

import "fmt" 

func assign() int { 
    return 1 
} 

func reference(foo *int) int { 
    *foo = 2 
    return 0 
} 

func main() { 
    var a, b int 

    a = assign() 
    reference(&b) 

    fmt.Println(a) 
    fmt.Println(b) 
} 

.. 참고로, B를 통과하는 대에 값을 할당 사이의 실질적인 차이는 무엇인가?

실제 코드의 관점에서 볼 때 json.Unmarshal()은 Unmarshalled 값을 반환하기보다는 변수에 포인터를 전달해야 변수에 값을 할당 할 수 있습니까?

+0

이동은 "값으로 전달합니다." 따라서'reference' 함수는 정수 값을 가리키는 포인터를 참조 값으로 취합니다. 이 함수에서 아무것도 반환 할 필요가 없습니다. – squiguy

답변

0

값을 전달하려면 매개 변수를 복사해야하지만 참조 할 때는 포인터를 개체로 보내면됩니다. Golang은 슬라이스를 포함하여 기본적으로 값을 전달합니다.

json.Unmarshal에 대한 특정 질문에 대해서는 Unmarshal 코드가 전달 된 객체가 json에있는 호환 가능한 유형의 동일한 필드 이름을 포함하는지 확인할 수있는 이유가 있다고 생각합니다. 예를 들어, json에 반복 필드가있는 경우, 비 정렬 화되고있는 객체에 대응하는 슬라이스가 필요합니다.

그래서 우리는 JSON 문자열이 언 마샬링되기를 원하는 구조체를 전달해야합니다. Unmarshal이 필드를 채울 수 있도록하려면 포인터 여야합니다. 일반 인터페이스를 전달한 경우 Unmarshal은지도를 반환합니다. Unmarshal이 구조체/인터페이스에 대한 포인터를 가져 가지 않았다면 항상지도를 반환하도록 구현되었을 수 있었지만이 방법이 더 유용하다고 생각합니다.

이 간단한 예이지만, 유용 할 수 있습니다 - https://play.golang.org/p/-n8euepSS0

+0

아, 알겠습니다. 나는 json.Unmarshal()에 특정 유형을 전달하는 것에 대해 생각하지 않았고 반환 값을 "필터링"하기 위해이를 사용했습니다. 지금까지 보아온 모든 예제에서 모든 것이 JSON의 모든 속성을 푸는 인터페이스 {}를 사용했습니다. 반면에 메서드가 JSON을 파싱하여 반환하면 선택의 여지가 없습니다. – Marc

+0

"골란은 슬라이스를 포함하여 기본적으로 값을 전달합니다." - 그렇습니다. 그러나 슬라이스 자체에 데이터에 대한 포인터가 포함되어 있기 때문에 좀 더 복잡해 지므로 참조 유형으로 작동합니다. 값으로 전달 된 경우에도 요소를 수정할 수 있습니다. https://play.golang.org/p/XmmeiCkRYy 용량에 따라 추가가되거나 작동하지 않을 수 있습니다 (추가 기능으로 인해 포인터가 새 메모리를 가리킬 수 있기 때문에 변경 될 수 있습니다). 위치) : https://blog.golang.org/go-slices-usage-and-internals [https://blog.golang.org/slices#TOC_4.](https://blog.golang.org/slices) # TOC_4.) – user1431317

관련 문제