Go AST/Types——如何判断错误?

标签 go types abstract-syntax-tree

有更好的方法吗?我需要知道 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/

相关文章:

python - 实现具有固定键类型(例如枚举类型)的字典的最佳方法?

c# - 如何在 C# 中对变量定义中的接口(interface)求和?

groovy - Getter 和 Setter AST 转换

go - 如何在发布请求中删除静态中间件?

go - 是否可以捕获由外部命令设置的环境变量?

go - 如何为 pq 驱动程序准备一个带有动态表名的 INSERT 语句

scala - 什么是 Scala 中的类型 lambda,它们有什么好处?

c++ - 如何将 Clang AST 中的 TemplateTypeParm 节点与 AST_Matchers 匹配?

Java AST 解析器 - 获取参数的完整类型、外部项目

javascript - 如何用 Golang 创建前端?以及其他问题