Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menemui Jenis Pakej Secara Dinamik dalam Go?

Bagaimanakah Saya Boleh Menemui Jenis Pakej Secara Dinamik dalam Go?

DDD
DDDasal
2024-12-15 12:51:24728semak imbas

How Can I Discover Package Types Dynamically in Go?

Mencari Jenis Pakej Secara Dinamik

Walaupun tiada mekanisme penemuan jenis dalam pakej refleksi, kaedah lain wujud untuk menemui jenis yang dieksport, terutamanya struct , pada masa jalan.

Pergi 1.5 dan Kemudian

Dalam Go 1.5 dan ke atas, jenis dan pakej pengimport boleh membantu dalam tugas ini. Coretan kod berikut menunjukkan proses:

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)
    }
}

Versi Pra-1.5

Sebelum Pergi 1.5, pakej ast menyediakan satu-satunya pendekatan yang tidak menggodam masalah ini . Dengan menyusun kod sumber, pakej ini boleh mengekstrak maklumat jenis:

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
    })
}

Teknik ini membenarkan penemuan jenis yang dieksport, terutamanya struct, dalam menjalankan pakej Go, membolehkan analisis lanjut dan instantiasi kejadian.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menemui Jenis Pakej Secara Dinamik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn