繁体   English   中英

检查 ast.Expr 是否在 Go 中实现了接口

[英]Check if ast.Expr Implements Interface in Go

有没有什么办法,如果任何我们可以检查ast.Expr正在实施interfacefmt.Stringer

我发现这个功能types.Implements()可以用在这里,但我不知道我怎样才能创建types.Interface了现有的interface类型,如fmt.Stringer ,这是需要types.Implements()函数。

我正在寻找这样的函数实现:

func isStringer(ti *types.Info, obj ast.Expr) bool {
    panic("not implemented")
}

我目前使用的解决方法:

func isStringer(ti *types.Info, obj ast.Expr) bool {
    t := ti.TypeOf(obj).(*types.Named)

    for i := 0; i < t.NumMethods(); i++ {
        if t.Method(i).Type().(*types.Signature).String() == "func() string" {
            return true
        }
    }

    return false
}

我检查接口是否实现的常用方法是使用长格式类型断言

前任:

func isStringer(obj ast.Expr) bool {
    _, ok := obj.(fmt.Stringer)
    return ok
}

这里发生的事情是,当我们为类型断言提供第二个变量(通常按照约定命名为ok )时,如果类型无法转换,go 不会恐慌,而是设置ok = false

然后我们可以简单地返回ok的值,并确保如果ok == true obj实现 stringer,如果ok == false则不会。

如果我们想使用 stringer 接口提供的方法,我们也可以返回 cast 变量:

func isStringer(obj ast.Expr) (fmt.Stringer, bool) {
    return obj.(fmt.Stringer)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM