1 回答

TA貢獻2039條經驗 獲得超8個贊
添加包。需求類型和
包。需要類型信息
到加載模式。這樣,每個加載的包都將初始化其“類型信息
”字段,并且該字段的類型為 *類型?!靶畔ⅰ?/code>
有一個名為“類型”
的字段,該字段將 ast 表達式映射到類型。您可以通過以下方式使用它:
func main() {
loadConfig := new(packages.Config)
loadConfig.Mode = packages.NeedSyntax | packages.NeedTypes | packages.NeedTypesInfo
loadConfig.Fset = token.NewFileSet()
pkgs, err := packages.Load(loadConfig, "syscall")
if err != nil {
panic(err)
}
for _, pkg := range pkgs {
for _, syn := range pkg.Syntax {
for _, dec := range syn.Decls {
if fd, ok := dec.(*ast.FuncDecl); ok && fd.Name.Name == "Kill" {
x1 := fd.Type.Params.List[0].Type // int
x2 := fd.Type.Params.List[1].Type // syscall.Signal
tv1 := pkg.TypesInfo.Types[x1]
tv2 := pkg.TypesInfo.Types[x2]
if basic, ok := tv1.Type.(*types.Basic); ok {
fmt.Printf("%#v\n", basic) // int
}
if named, ok := tv2.Type.(*types.Named); ok {
fmt.Printf("%v\n", named.Obj()) // *types.TypeName (Signal)
fmt.Printf("%#v\n", named.Underlying()) // *types.Basic (int)
}
}
}
}
}
}
- 1 回答
- 0 關注
- 87 瀏覽
添加回答
舉報