亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何從 *types.Named 獲取類型

如何從 *types.Named 獲取類型

Go
MMTTMM 2022-05-18 13:40:55
我試圖找到作為第一個參數的funcs 的函數調用。context.Context我已經能夠執行下面顯示的操作,但我一直堅持從*types.Named. 我怎樣才能做到這一點?package mainimport (    "bytes"    "context"    "fmt"    "go/ast"    "go/printer"    "go/token"    "go/types"    "golang.org/x/tools/go/analysis"    "golang.org/x/tools/go/analysis/singlechecker")var Analyzer = &analysis.Analyzer{    Name: "addlint",    Doc:  "reports integer additions",    Run:  run,}func main() {    singlechecker.Main(Analyzer)}func funcHasContextContextAsFirstParam(pass *analysis.Pass, expr ast.Expr) bool {    t := pass.TypesInfo.TypeOf(expr)    if t == nil {        return false    }    bt, ok := t.Underlying().(*types.Signature)    if !ok {        return false    }    fmt.Printf("signature: %+v - %T\n", bt, bt)    params := bt.Params()    for i := 0; i < params.Len(); i++ {        v := params.At(i)        fmt.Printf("Type :  %T\n", v.Type())        if named, ok := v.Type().(*types.Named); ok {            // fmt.Printf("named : %v - %T\n", named.Obj(), named.Obj())            fmt.Printf("named : %T\n", named)            fmt.Printf("named.Obj() : %T\n", named.Obj())            typ := named.Underlying()            fmt.Printf("typ:  %T\n", typ.Underlying())            if _, ok = typ.(context.Context); ok {                fmt.Printf("context.Context type!\n")            }        }    }    return true}func run(pass *analysis.Pass) (interface{}, error) {    for _, file := range pass.Files {        ast.Inspect(file, func(n ast.Node) bool {            be, ok := n.(*ast.CallExpr)            if !ok {                return true            }這就是我得到的輸出:call expression &{Fun:foo Lparen:6160580 Args:[c 0xc0003c5780 0xc0003c57c0] Ellipsis:0 Rparen:6160596}signature: func(ctx context.Context, n int, str string) - *types.SignatureType :  *types.Namednamed : *types.Namednamed.Obj() : *types.TypeNametyp:  *types.Interface
查看完整描述

1 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

我最終得到了這樣的結果:


func funcHasContextContextAsFirstParam(pass *analysis.Pass, expr ast.Expr) bool {

    t := pass.TypesInfo.TypeOf(expr)

    if t == nil {

        return false

    }


    bt, ok := t.Underlying().(*types.Signature)

    if !ok {

        return false

    }


    params := bt.Params()


    if params.Len() < 1 {

        return false

    }


    param := params.At(0)

    named, ok := param.Type().(*types.Named)

    if !ok {

        return false

    }


    namedObj := named.Obj()

    if namedObj.Name() != "Context" || namedObj.Pkg().Name() != "context" {

        return false

    }


    return true

}


查看完整回答
反對 回復 2022-05-18
  • 1 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號