2013-02-17 1 views
3

오늘 이동 둘러보기 작업. 구조체에 대한 포인터와 연관된 메소드에 구조체 리터럴을 전달할 수 있고 그 반대의 경우도 있음을 알았습니다. 왜 이것이 허용됩니까?방법 수신기 모호성

package main 

import (
    "fmt" 
) 

type Vertex struct { 
    X, Y float64 
} 

func (v Vertex) Scale (f float64) { 
    v.X = v.X * f 
    v.Y = v.Y * f 
} 

func (v *Vertex) ScaleP(f float64) { 
    v.X = v.X * f 
    v.Y = v.Y * f 
} 

func main() { 
    v := &Vertex{3, 4} 
    vLiteral := Vertex{3, 4} 

    v.Scale(5) 
    fmt.Println(v) 

    v.ScaleP(5) 
    fmt.Println(v) 

    vLiteral.Scale(5) 
    fmt.Println(vLiteral) 

    vLiteral.ScaleP(5) 
    fmt.Println(vLiteral) 
} 

출력 :

&{3 4} 
&{15 20} 
{3 4} 
{15 20} 
+0

도 참조 [이 (http://stackoverflow.com/q/13326099/ 720999) 및 [this] (http://stackoverflow.com/q/13303254/720999). – kostix

답변

5

Method sets를 참조하십시오

유형은 그것과 관련된 방법 세트 (§Interface 유형, §Method 선언)이있을 수 있습니다. 인터페이스 유형의 메소드 세트는 인터페이스입니다. 다른 타입 T의 메소드 세트는 수신기 타입 T를 갖는 모든 메소드들로 구성된다. 대응하는 포인터 타입 * T의 메소드 세트는 수신기 * T 또는 T를 갖는 모든 메소드들의 세트이다 (즉, 티). 구조체 섹션에 설명 된대로 익명 필드가 포함 된 구조체에 적용되는 규칙이 더 있습니다. 다른 유형에는 빈 메소드 세트가 있습니다. 메소드 세트에서 각 메소드는 고유 한 메소드 이름을 가져야합니다.

형식의 메서드 집합은 형식이 구현하는 인터페이스와 해당 형식의 수신기를 사용하여 호출 할 수있는 메서드를 결정합니다.

EDIT :

Calls 참조 : (의 타입)에있어서의 집합 X는 m이 포함 인수 목록이 할당 될 수 있다면

메소드 호출 XM()가 유효 m의 매개 변수 목록에 추가하십시오. X는 어드레싱 &이고 X의 방법 세트 m, XM() 속기가있다 (X &)하는 .m()을 포함하는 경우 :

+0

"다른 유형 T의 메소드 세트는 수신기 유형 T의 모든 메소드로 구성됩니다." 그러나 vLiteral.ScaleP (5)는 여전히 컴파일됩니다. – SChang

+1

네, 맞습니다. 업데이트 된 답변을 참조하십시오. – zzzz

+1

Go 커뮤니티 wiki [MethodSets] (http://code.google.com/p/go-wiki/wiki/MethodSets) 항목에도 자세히 설명되어 있습니다. –