>백엔드 개발 >Golang >Go에서 패키지 유형을 동적으로 검색하려면 어떻게 해야 하나요?

Go에서 패키지 유형을 동적으로 검색하려면 어떻게 해야 하나요?

DDD
DDD원래의
2024-12-15 12:51:24723검색

How Can I Discover Package Types Dynamically in Go?

동적으로 패키지 유형 찾기

reflect 패키지에 유형 검색 메커니즘이 없음에도 불구하고 내보낸 유형, 특히 구조체를 검색하기 위한 다른 방법이 존재합니다. , 런타임에.

1.5로 이동하여 나중에

Go 1.5 이상에서는 유형 및 가져오기 패키지가 이 작업에 도움이 될 수 있습니다. 다음 코드 조각은 프로세스를 보여줍니다.

package main

import (
    "fmt"
    "go/importer"
)

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

1.5 이전 버전

Go 1.5 이전에는 ast 패키지가 이 문제에 대해 해킹되지 않은 유일한 접근 방식을 제공합니다. . 이 패키지는 소스 코드를 컴파일하여 유형 정보를 추출할 수 있습니다.

package main

import (
    "fmt"
    "go/ast"
    "go/parser"
    "go/token"
)

func main() {
    fset := token.NewFileSet()
    node, err := parser.ParseFile(fset, "time.go", nil, parser.ParseComments)
    if err != nil {
        fmt.Printf("error: %s\n", err.Error())
        return
    }
    ast.Inspect(node, func(n ast.Node) bool {
        if n, ok := n.(*ast.TypeSpec); ok {
            fmt.Println(n.Name.Name)
        }
        return true
    })
}

이러한 기술을 사용하면 실행 중인 Go 패키지 내에서 내보낸 유형, 특히 구조체를 검색할 수 있으므로 인스턴스를 추가로 분석하고 인스턴스화할 수 있습니다.

위 내용은 Go에서 패키지 유형을 동적으로 검색하려면 어떻게 해야 하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.