2013-03-10 2 views
1

reflect 패키지 설명서를 확인했지만 아무 것도 찾지 못했습니다. 내가 뭘 하려는지 인터페이스 X를 구현하는 모든 구조체를 찾을 수 있습니다. 그런 다음 모든 구조체를 반복하여 액션 y를 실행합니다.특정 인터페이스를 구현하는 모든 구조체를받을 수 있습니까?

+0

이것이 가능한지 의심 스럽습니다. 인터페이스에 관한 구현에 대해 알고있는 내용에서 런타임에 정보가 저장되지 않습니다. – fuz

답변

2

이것은 런타임에는 수행 할 수 없지만 프로그램 패키지 (및 모든 가져 오기를 재귀 적으로 검사)를 통해서만 정적으로 수행 할 수 있습니다. 또는 생성 된. {o, a} 파일을 정적으로 검사합니다.

그러나, 하나는 수동으로 인터페이스를 만족 유형의 목록 (?하지 만 구조체에 제한을 이유를) 만들 수

if _, ok := concreteInstance.(concreteInterface); ok { 
     // concreteInstance satisfies concreteInterface 
} 
3

이 같은 인터페이스 (playground link)과 유형 선언을 사용합니다. 일부 struct 인스턴스가 있다고 가정하고 있습니다 (아래 예의 경우 []interface{} 일 수도 있음).

package main 

import "fmt" 

type Zapper interface { 
    Zap() 
} 

type A struct { 
} 

type B struct { 
} 

func (b B) Zap() { 
    fmt.Println("Zap from B") 
} 

type C struct { 
} 

func (c C) Zap() { 
    fmt.Println("Zap from C") 
} 

func main() { 
    a := A{} 
    b := B{} 
    c := C{} 
    items := []interface{}{a, b, c} 
    for _, item := range items { 
     if zapper, ok := item.(Zapper); ok { 
      fmt.Println("Found Zapper") 
      zapper.Zap() 
     } 
    } 
} 

또한 define the interface on the fly하고 해당 스타일과 같은 일회성 당신이 대신하는 경우 루프에서 item.(interface { Zap() })를 사용할 수 있습니다.

관련 문제