第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何在 AST 解析器中將類型解析為基元

如何在 AST 解析器中將類型解析為基元

Go
慕田峪9158850 2022-10-04 18:46:51
我想提取函數(shù)的簽名,以便能夠在其上生成一些包裝方法。為此,我正在使用它,它為我提供了閱讀AST的可能性。golang.org/x/tools/go/packages例如,對于函數(shù)定義,您會收到一些func MyFunc(param int)ast.FuncDecl{     Type: *FieldList{         List: []*Field{             {                 Names: []*Ident{ /*...*/ },                 Type:  nil, /*...*/             },         },     }, }其中“類型”表示類型。我想為所有參數(shù)生成一些特殊代碼,但int也可以用一些類型聲明隱藏inttype MyType int如何將類型轉(zhuǎn)換為編譯器具有的實(shí)際類型?ast
查看完整描述

1 回答

?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊

添加包。需求類型和包。需要類型信息到加載模式。這樣,每個(gè)加載的包都將初始化其“類型信息”字段,并且該字段的類型為 *類型?!靶畔ⅰ?/code>有一個(gè)名為“類型”的字段,該字段將 ast 表達(dá)式映射到類型。您可以通過以下方式使用它:

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)

                    }

                }

            }

        }

    }

}


查看完整回答
反對 回復(fù) 2022-10-04
  • 1 回答
  • 0 關(guān)注
  • 95 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號