我需要解析 Go 源代码文件,找到特定类型(按名称)并在我的程序中使用它。我已经设法使用go/ast包找到了我需要的类型,但我不知道如何将它“加载”到我的程序中以便我可以使用它。
问题:从外部源代码文件中提取和使用类型并在运行时使用它的最佳方法是什么?
除了一个丑陋的方法来基本上复制文件,通过注入一个“main”函数来修改它,我的编码内容将结果发送到stdOut,执行它,从stdout收集编码数据,删除修改后的文件。
用例:分析 go 源代码并以特定格式(例如 json 模式)对类型进行编码
编辑:这是一些代码。问题是如何编码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" ???
}
也在操场上
拉丁的传说
蝴蝶不菲
相关分类