【发布时间】:2021-12-01 07:45:24
【问题描述】:
有什么方法可以检查ast.Expr 是否像fmt.Stringer 一样实现interface?
我发现这个函数types.Implements() 可以在这里使用,但是我不确定如何从现有的interface 类型中创建types.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
}
【问题讨论】:
-
这个例子使用
reflect包,我想从与reflect不兼容的types包中得到同样的结果。
标签: go interface abstract-syntax-tree analyzer