Мне нужно проанализировать файл исходного кода Go, найти определенный тип (по имени) и использовать его в моей программе. Мне уже удалось найти тот тип, который мне нужен, используя пакет go/ast, но я не знаю, как его загрузить в мою программу, чтобы я мог его использовать.Как оценивать внешний исходный код «динамически»?
Вопрос: Каков наилучший способ извлечь и использовать тип из внешнего файла исходного кода и использовать его во время выполнения?
Я не могу придумать ничего, кроме уродливого метода, чтобы в основном скопировать файл, изменить его, введя «основную» функцию с помощью материала кодирования, который отправляет результат на stdOut, выполняет его, собирает закодированные данные из stdout, удалите измененный файл.
использования: Анализ идти исходный код и кодировать типы в определенном формате (например, JSON-схему)
Edit: Вот код. Вопрос заключается в том, как закодировать type allTypes
(нулевое значение), а затем распечатать его.
package main
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
"encoding/json"
)
var src string = `
package mypack
type allTypes struct{
Brands Brands
Colours Colours
}
type Brands struct{
Sony string
Apple string
}
type Colours struct{
Red string
Green string
}
`
type sometype struct{
Nothing int
}
func main() {
// src is the input for which we want to inspect the AST.
// Create the AST by parsing src.
fset := token.NewFileSet() // positions are relative to fset
f, err := parser.ParseFile(fset, "src.go", src, 0)
if err != nil {
panic(err)
}
// Inspect the AST and find our function
var tp ast.TypeSpec
ast.Inspect(f, func(n ast.Node) bool {
switch x := n.(type) {
case *ast.TypeSpec:
if x.Name.Name == "allTypes"{
tp = *x
}
}
return true
})
fmt.Printf("We found the type: it is %v", tp)
// Encode the zero value of sometype
x := sometype{}
b, _ := json.Marshal(&x)
fmt.Printf("\n Zero value of someType (json) %s", b)
//Next/Question: How to encode the zero value of "allTypes" ???
}
playground Также на
Я знаю об отраженном пакете, но вопрос совершенно другой. –
@ Theuserwithnohat тогда, пожалуйста, отредактируйте свой вопрос и объясните, как он отличается, потому что пример, который вы дали (схема JSON), может быть выполнен с помощью 'reflect'. –
Дело в том, что код загружается из внешнего файла/исходного кода. –