最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 确定 Golang 中函数返回的接口 {} 值的类型

    确定 golang 中函数返回的接口 {} 值的类型

    问题内容

    我有一个从枚举返回值的函数。枚举定义如下:

    type DataType int64
    
    const (
        INT DataType = iota
        FLOAT
        STRING
        BOOL
        CHAR
        VOID
        ERROR
        BREAK
        CONTINUE
    )
    
        func (l *TSwiftVisitor) VisitWhileInstr(ctx *parser.WhileInstrContext) interface{} {        
        if condExpression.ValType == BOOL {             
            condResult := condExpression.asBool()       
            for condResult {            
                for _, currentInstr := range ctx.InstrList().AllInstr() {
                    execResult := l.Visit(currentInstr)
                    fmt.Printf("TYPE -> %Tn", execResult) // Prints exec.DataType (the type)
                    fmt.Printf("VALUE -> %vn", execResult) // Prints 5 (the enum value)
                    if execResult == BREAK { // This never executes
                        fmt.Println("Es break")
                        return VOID
                    } else { // This executes
                        fmt.Println("Es otra mierda")
                    }
                }           
                condResult = l.Visit(ctx.Expr()).(*Expression).asBool()
            }       
        } else {
            return ERROR
        }
        return VOID
    }

    Visit方法的签名如下

    Visit(tree antlr.ParseTree) interface{}

    调用该方法后,我收到一个 DataType 类型的值,并在以下几行中打印该类型和返回值。

    fmt.Printf("TYPE -> %Tn", execResult) // Prints exec.DataType (the type)
    fmt.Printf("VALUE -> %vn", execResult) // Prints 5 (the enum value)

    输出如下:

    TYPE -> exec.DataType                   
    VALUE -> 5

    到目前为止,一切都很好,但是我需要进行比较,这就是我遇到的问题,那就是我对 Golang 不太了解。我有以下内容:

    if execResult == BREAK { // This never executes
        fmt.Println("It's a break")
        return VOID
    } else { // This executes
        fmt.Println("It's another thing")
    }

    这就是我不知道如何继续验证返回类型的地方,如果我尝试以下几行,我永远不会执行我想要的代码,在本例中是返回 VOID。我的问题是如何比较返回类型以根据结果执行特定操作。我还尝试过以下方法:

    switch execResult.(type) {
        case DataType:
            if execResult.(DataType) == BREAK {
    
                return execResult
            }
    }

    在这种情况下,开关内的情况也不满足。我的问题基本上是如何确定从函数调用返回的接口{}值的类型。

    正确答案

    我认为@Charlie Tumahai 是对的:问题是价值观不匹配。我尝试了 Go Playground 上的一个小示例,它的工作原理与我们预期的一样:如果 DataType 是从 Visit 返回,然后与 DataType 的比较可以为 true。

    返回的类型必须DataType 类型。 Visit2 方法演示了这一点:它返回一个 int64,它永远不会等于 BREAK

    Go 编程语言规范中的比较运算符下对此进行了介绍:

    package main
    
    import "fmt"
    
    type DataType int64
    
    const (
        INT DataType = iota
        BREAK
        CONTINUE
    )
    
    func Visit() interface{} { return BREAK }
    func Visit2() interface{} {return int64(BREAK) }
    
    func main() {
        for _, x := range []interface{}{Visit(), Visit2()} {
            fmt.Printf("x = %v, T(x) = %T : ", x, x)
            if x == BREAK {
                fmt.Println("x is BREAK")
            } else {
                fmt.Println("Cannot identify x")
            }
        }
    
        // Output:
        // x = 1, T(x) = main.DataType : x is BREAK
        // x = 1, T(x) = int64 : Cannot identify x
    }
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 确定 Golang 中函数返回的接口 {} 值的类型
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情