2017-12-15 7 views
0

아래 코드를 참조하십시오. 포인터가 아닌 수신기가 포인터와 비 포인터 값을 받아 들일 수 있지만 포인터 수신기는 포인터 값만 받아 들일 수 있다는 사실을 알고 있습니다. 즉, 나는 마지막 호출이 어떻게 작동하는지 이해하지 못하고 두 번째 마지막 호출은 이해하지 못한다. (Run Here)포인터 값이 아닌 호출 포인터 수신자 메서드

문제는 포인터가 아닌 메서드에서 포인터 수신기 메서드를 호출 할 수 있다는 것입니다. 이는 other similar question에 설명되어 있지 않습니다. 그 대답은 포인터 호출 포인터 수신기 메서드에 대해서만 설명합니다.

package main 

import (
    "fmt" 
) 

type person struct { 
    name string 
} 

type human interface { 
    speak() string 
} 

func (p *person) speak() string { 
    return "Speak() called by " + p.name 
} 

func saySomething(h human) { 
    fmt.Println("area", h.speak()) 
} 

func main() { 
    p := person{"harsh"} 
    //works 
    saySomething(&p) 

    //doesn't work 
    //saySomething(p) 

    //works 
    p.speak() 
} 
+1

포인터 수신기가있는 [골란 (Golang) 방법]의 가능한 복제본 (https://stackoverflow.com/questions/33936081/golang-method-with-pointer-receiver) – Marc

+0

제목에 대한 좋은 읽기 : https : // blog .golang.org/reflection of laws – Kaedys

답변

1

유형 personhuman 인터페이스를 구현하지 않기 때문에 두 번째 호출이 작동하지 않습니다 (단 *person는 않습니다). 포인터가 아닌 값에서 포인터 수신기를 사용하여 메서드를 호출 할 수있는 "마법"은 그 특정 경우에만 적용됩니다. 인터페이스 변수 또는 필드에 값을 할당하거나 인터페이스를 예상하는 매개 변수로 전달할 때 값 유형이 인터페이스를 구현해야합니다.

p.speak()을 호출하면 컴파일러에서 자동으로 해당 값을 (&p).speak()으로 변경합니다. 포인터가 아닌 수신기가있는 메서드를 포인터에 호출하면 비슷한 방향으로 변환됩니다.