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

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

解析 go src,嘗試將 *ast.GenDecl 轉(zhuǎn)換為 types.Interface

解析 go src,嘗試將 *ast.GenDecl 轉(zhuǎn)換為 types.Interface

Go
慕村225694 2021-11-22 18:27:19
我正在嘗試解析包含接口的 go 源文件并找到接口定義的方法/簽名。我正在使用 ast 來(lái)解析文件。我能夠獲得一些高級(jí)聲明,例如 *ast.GenDecl,但我無(wú)法進(jìn)入下一個(gè)級(jí)別來(lái)確定此類(lèi)型是否為接口及其方法。這是一個(gè)腳手架類(lèi)型的問(wèn)題,我試圖解決用戶定義服務(wù)接口和工具將構(gòu)建服務(wù)框架的問(wèn)題package mainimport (        "fmt"        "go/ast"        "go/parser"        "go/token"        "reflect")func main() {        fset := token.NewFileSet()        f, _ := parser.ParseFile(fset, "/tmp/tmp.go", `package service        type ServiceInterface interface {                        Create(NewServiceRequest) (JsonResponse, error)                        Delete(DelServiceRequest) (JsonResponse, error)        }`, 0)        for _, v := range f.Decls {            switch t := v.(type) {            case *ast.FuncDecl:                    fmt.Println("func ", t.Name.Name)            case *ast.GenDecl:                    switch x := t.Specs[0].(type) {                    default:                            fmt.Println(x, reflect.TypeOf(x))                    }            default:                    fmt.Printf("skipping %t\n", t)            }    }}結(jié)果,但我似乎根本找不到有關(guān)接口聲明內(nèi)部結(jié)構(gòu)的任何信息。&{<nil> ServiceInterface 0x8202d8260 <nil>} *ast.TypeSpec
查看完整描述

1 回答

?
Smart貓小萌

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

使用 AST 時(shí),我發(fā)現(xiàn)使用spew包轉(zhuǎn)儲(chǔ)示例很有幫助:


    fset := token.NewFileSet()

    f, _ := parser.ParseFile(fset, "/tmp/tmp.go", `package service ....`)

    spew.Dump(f)

我發(fā)現(xiàn)從 spew 輸出中編寫(xiě)所需的代碼很容易。


這里有一些代碼可以幫助您入門(mén)。它打印接口和方法名稱:


package main


import (

  "fmt"

  "go/ast"

  "go/parser"

  "go/token"

)


func main() {

  fset := token.NewFileSet()

  f, _ := parser.ParseFile(fset, "/tmp/tmp.go", `package service


    type ServiceInterface interface {

                    Create(NewServiceRequest) (JsonResponse, error)

                    Delete(DelServiceRequest) (JsonResponse, error)

    }`, 0)

  for _, x := range f.Decls {

    if x, ok := x.(*ast.GenDecl); ok {

        if x.Tok != token.TYPE {

            continue

        }

        for _, x := range x.Specs {

            if x, ok := x.(*ast.TypeSpec); ok {

                iname := x.Name

                if x, ok := x.Type.(*ast.InterfaceType); ok {

                    for _, x := range x.Methods.List {

                        if len(x.Names) == 0 {

                            continue

                        }

                        mname := x.Names[0].Name

                        fmt.Println("interface:", iname, "method:", mname)


                    }

                }

            }

        }

    }

  }

}

http://play.golang.org/p/eNyB7O6FIc


查看完整回答
反對(duì) 回復(fù) 2021-11-22
  • 1 回答
  • 0 關(guān)注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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