2017-02-04 1 views
1

인터페이스의 유형에 따라 기능을 선택하는이 관용구의 이름이 있습니까? 이 관용구의 이름이 있습니까?

type encoderFunc func(e *encodeState, v reflect.Value, opts encOpts) 

var encoderCache struct { 
    m map[reflect.Type]encoderFunc 
} 

func (e *encodeState) marshal(v interface{}, opts encOpts) (err error) { 
    v := refect.ValueOf(v) 
    valueEncoder(v)(e, v, opts) 
    return nil 
} 

func valueEncoder(v reflect.Value) encoderFunc { 
    return encoderCache.m[v.Type()] 
} 

encoding/json에서 복사 약간 데모 변경.

+0

나는 잘 모르겠지만, 이것은 일종의 상속 재산이라고 생각합니다. 함수가 인터페이스 대신 ABC의 일부인 경우 언어는 유형에 따라 올바른 메소드를 자동으로 선택합니다. – Carcigenicate

+0

@Carcigenicate, 어떤 기능을 의미합니까? 나는 이것이 어떤 식 으로든 상속과 관련이 있다고 생각하지 않는다. 관련된 유형은 완전히 무관합니다. – Sridhar

+0

Nvm, 코드를 잘못 읽은 것 같습니다. 상단의 설명과 코드에서부터 객체의 유형에 따라 함수를 파견하는 것처럼 보였습니다. – Carcigenicate

답변

2

나는 동적 메서드 디스패치를 ​​이라고합니다. Go 인터페이스 구현에서 사용되는 메커니즘과 동일하거나 다소 다를 수 있습니다. map[reflect.Type]encoderFunci-table입니다. 우리는 내장 타입에 대한 메소드를 작성할 수 없다는 점을 제외하면 인터페이스만으로 마샬링을 재 작성할 수도있다.

type encodable interface{ 
    encode(e *encodeState, opts encOpts) 
} 
func (st SomeType) encode(e *encodeState, opts encOpts){ 
... 
} 
... 
func (ot OtherType) encode(e *encodeState, opts encOpts){ 
... 
} 
func (e *encodeState) marshal(v encodable, opts encOpts) (err error) { 
    v.encode(e, opts) 
    return nil 
} 
+0

포인트 @Sridhar에 감사드립니다. 미안하지만 오타였습니다. – Uvelichitel

관련 문제