2016-11-24 9 views
2

나는 "The Go Programming Language"라는 책을 읽었습니다. 우리 (오히려) 경험 많은 프로그래머에게는 매우 좋으며 다른 언어의 교차점에 대한 차이점을 설명합니다. 그러나 나는 완전히 이해하지 못하는 사례를 발견했습니다.struct 리터럴을 사용하십시오. 왜이 주소를 지정할 수 있습니까?

나는 C++이 충분히 훌륭하다는 것을 안다. Go 호출 (C++에서는 무엇이 호출 될 것인가) rvalues ​​/ xvalues ​​"non-addressable"을 이해한다. "variables" [GOPL의 단어] 만 처리 할 수 ​​있습니다.

괜찮아요. 말된다.

따라서 예를 들어,이 (*Point).ScaleBy는 수신기 인수로 *Point를 가져 와서 Point 리터럴 비 - 어 드레서 블이므로

Point{1, 2}.ScaleBy(2) // compile error: can't take address of Point literal 

(처음 인쇄 페이지 (159)에 의한) 불법이다.

(이 책을 읽지 않았다면, Point이 필드 X, Y float64와 구조체이다. 그러나

, 162 페이지에, 우리는 분명히 유효하며 것이다

type ColoredPoint struct { 
    *Point 
    Color color.RGBA 
} 

p := ColoredPoint(&Point{1, 1}, red) 
// ...more code ... 

이 컴파일

질문 :.

두 번째 경우의 Point 리터럴에 주소 지정이 가능한 이유는 무엇입니까?

편의를 위해 특별한 경우입니까, 아니면 큰 그림에서 무엇인가 놓치고 있습니까?

답변

3

&T{} 표기는 4.4.1 절에 설명되어, 구조체 리터럴, 페이지 103 :

pp := &Point{1, 2} 
: 구조체가 공통적으로 포인터를 통한 처리되므로

, 그것은 그 주소를 생성하고 초기화 구조체 변수 및 수득 줄여서 표기를 사용하는 것이 가능

그것은

pp := new(Point) 
*pp = Point{1, 2} 

하지만 &Point{1, 2} 정확히 동등한 그러한 함수 호출 등의 표현에서 직접 사용될 수있다.

다행히 책을 즐기고 있습니다.

+0

나는 그것을 정말로 즐긴다! 나는 그것을 (다소 서둘러) 읽는다. 왜냐하면 나는 곧 풀 타임으로 Go 코드를 작성하는 직업에 착수 할 것이기 때문이다. 이 부분을 놓쳤을 것입니다. 나는 이것이 K & D와 함께 저기에 있다고 생각한다. 나는 K &R. ; -를 의미한다.) 다시 한번 감사드립니다! – Tobias

3

편의상 특별한 경우입니다. 사양에는 예외 here이 언급되어 있습니다.

주소 지정 요구 사항의 예외로 x는 (괄호로 묶은) 복합 리터럴 일 수도 있습니다. 멜로우 마모 트의 대답에 좀 더 자세하게 추가

+0

감사합니다.이 질문은 분명히 직접적인 대답입니다. 나는 그것을 곧 그렇게 표시 할 것이다. – Tobias

3

:

Spec: Variables:

내장 함수 new를 호출하거나 composite literal의 주소를 복용 런타임에 변수에 대한 스토리지를 할당합니다. 이러한 익명의 변수는 (암시 적으로) pointer indirection을 통해 참조됩니다.

Point{1, 1}은 합성 리터럴이며 주소가 익명의 변수를 생성하고 표현식의 결과가이 익명 변수의 주소가됩니다.

그래서 당신은 기술적으로 볼 수는 해결되는 변수, 그래서 그것은이를 위반하지 않습니다

"변수" [GOPL의 단어] 주소입니다. 또한

당신이 할 수있는 어떤 다른 "맛있는"또는 트릭 볼이 답변을 체크 아웃 : How do I do a literal *int64 in Go?

+0

답변을 수락 해 주셔서 감사합니다. 매우 유용한 정보. – Tobias