有更好的方法吗?我需要知道 v 的类型是否是内置的“错误”类型。我觉得应该有一种更简洁的方法来做到这一点:
import (
"go/ast"
"go/types"
)
func IsError(v ast.Expr, info types.Info) bool {
t := info.Types[v]
return t.Type.String() == "error" &&
t.Type.Underlying().String() == "interface{Error() string}"
}
最佳答案
Type assertion是检查变量类型的惯用方法。
鉴于您正在处理一个 AST 表达式,我会尝试检查底层类型是否是一个接口(interface)以及是否实现了 Error()
方法:
isError := func(v ast.Expr, info *types.Info) bool {
if intf, ok := info.TypeOf(v).Underlying().(*types.Interface); ok {
return intf.NumMethods() == 1 && intf.Method(0).FullName() == "(error).Error"
}
return false
}
关于Go AST/Types——如何判断错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42945530/