【问题标题】:Go AST / Types - how to tell an error?Go AST / Types - 如何判断错误?
【发布时间】:2017-08-14 04:56:51
【问题描述】:

有没有更好的方法来做到这一点?我需要知道 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}"
}

【问题讨论】:

标签: go types abstract-syntax-tree


【解决方案1】:

Type assertion 是检查变量类型的惯用方式。

鉴于您正在处理 AST 表达式,我会尝试检查底层类型是否为接口以及是否实现了 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
}

【讨论】:

  • 在常规代码中,是的。但我正在扫描源文件的 AST,所以我有一个 ast.Expr 作为输入。
【解决方案2】:

我想我更喜欢这个解决方案:

https://play.golang.org/p/MA7F4Zpwqt

isError := func(v ast.Expr, info *types.Info) bool {
    if n, ok := info.TypeOf(v).(*types.Named); ok {
        o := n.Obj()
        return o != nil && o.Pkg() == nil && o.Name() == "error"
    }
    return false
}

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多