2017-11-03 2 views
0

나는 패키지의 모든 유형을하는 방법에 대한 질문이 답을 우연히 발견 : 위대한 작품을가져 오기 도구를 통해 패키지에 대한 모든 정보를 얻고 반영하십시오.

https://stackoverflow.com/a/32142080/470339

합니다. 그러나 다음 단계는 취할 각 유형에 대해 반복 수행하는 것입니다 (예 : NumMethod()). 즉각적인 분명한 방법을 찾지 못합니다. 누군가 빛을 발산 할 수 있습니까? 아니면 AST를 망쳐 놓아야합니까?

답변

1

당신은 LookupObject의 관심있는에 Scope와 이름을 사용할 수 있습니다.

를 객체 (예 : 패키지, 상수, 타입, 변수, 함수로 명명 된 언어의 실체를 설명 메소드 포함) 또는 레이블. 모든 개체는 Object 인터페이스를 구현합니다.

Object 인터페이스를 구현하는 Named 유형이 있습니다 그것은 NumMethods라는 메소드가 있습니다. 당신이 더 가고 싶은 경우 등에도 Struct, Slice에 의해 구현 된 types.Type 자사의 기본 유형을 볼 수 있도록

package main 

import (
    "fmt" 
    "go/importer" 
    "go/types" 
) 

func main() { 
    pkg, err := importer.Default().Import("time") 
    if err != nil { 
     fmt.Printf("error: %s\n", err.Error()) 
     return 
    } 

    scope := pkg.Scope() 
    for _, name := range scope.Names() { 
     if name == "Time" { 
      obj := scope.Lookup(name) 
      if tn, ok := obj.Type().(*types.Named); ok { 
       fmt.Printf("%#v\n", tn.NumMethods()) 
      } 
     } 
    } 
} 

다음

*types.NamedType 인터페이스를 구현