2013-07-29 2 views
4

나는 이동 튜토리얼에 따라, 그리고 난 특정 메소드 서명을 이해하지 못할 같이 붙어 차이 : 다음과 같이이동 - 매개 변수와 수신기

func (p *Page) save() error { 
    filename := p.Title + ".txt" 
    return ioutil.WriteFile(filename, p.Body, 0600) 
} 

워드 프로세서는 이것을 설명 :

을이 방법의 서명을 읽습니다 : "이것은받는 사람 p, Page에 대한 포인터를 취하는 save라는 메서드입니다. 매개 변수를 사용하지 않고 error 형식의 값을 반환합니다."

수신자가 무엇인지 이해할 수 없습니다. 나는 이것을 매개 변수로 읽었을 것이지만, 나는 매개 변수가 save()이 될 것으로 기대한다.

+1

C++, Java 또는 JavaScript에 익숙하다면 "수신자"는 'this'와 동일합니다. Perl이나 Python에 익숙하다면, 이것은 메소드의 첫번째 인수 (보통 파이썬 코드에서'self ')와 같은 것입니다. 네가 그 중 하나에 익숙하지 않다면, 그럼. . . 다른 객체 지향 언어에 익숙하십니까? – ruakh

+0

구문이 매우 혼란 스럽습니다. 나는 PHP와 파이썬을 사용한다. 가서 수업을 듣지 않니? –

+0

[이동 : 메서드 수신기와 매개 변수의 차이점은 무엇입니까?] (https://stackoverflow.com/questions/27159457/go-what-is-the-difference-between-a-method-receiver- and-parameter) –

답변

3

수신자는 귀하가 귀하의 방법을 선언 한 대상입니다.

개체에 메서드를 추가하려면이 구문을 사용합니다.

예 : http://play.golang.org/p/5n-N_Ov6Xz

+0

이것은 메소드가 속한 컨텍스트와 비슷합니까? –

+1

정확히. ruakh이 말했듯이, 이것은 C++ 'this'와 유사합니다. 현재 오브젝트 나 현재 오브젝트에 대한 포인터입니다 ('*'를 붙이 느냐에 달려 있음) – creack

3

수신기는 매개 변수의 단지 특별한 경우입니다. go 문법을 제공합니다 메서드를 연결하여 첫 번째 매개 변수를 수신기로 선언합니다. 예를 들어

:

func save(p *Page) error 

을 읽을 것이라고 "

func (p *Page) save() error 

선언에 반대 는"*Page 유형에 error를 반환 save라는 방법을 첨부 "를 읽고 형식이 *Page 인 하나의 매개 변수를 사용하는 save이라는 함수를 선언하고을 반환합니다."당신이 다음과 같은 코드를 시도 할 수 있습니다 단지 문법 설탕 있다는 증거로

:

p := new(Page) 
p.save() 
(*Page).save(p) 

모두 마지막 선이 정확하게 같은 메소드 호출을 나타낸다는.

또한 this answer을 읽으십시오.

+0

왜 이건 클래스의 메소드를 감싸고 클래스 -> func 같은 메소드를 호출하는 것보다 더 바람직합니까? 또한 유형을 전달 하는가? 그 일이 지금 무엇을하고 있는지, 왜 그런지 이해하지 못합니까?예를 들어 java에서는 객체를 전달할 필요없이 p-> save()를 간단히 수행 할 수 있습니다. (아마도 다른 모든 질문 !!) –

+2

Go에는 클래스가 없으며 유형 만 있습니다. 자바에 관해서도 같은 질문을 할 수 있습니다. Java 클래스의 모든 메소드를 꺼내서 명시 적으로 'this'를 매개 변수로 전달하여 절차 적으로 호출 할 수 있다고 상상해보십시오. 같은 것. – thwd