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

2024年 2月 5日 33.0k 0

确定 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
}

登录后复制

以上就是确定 Golang 中函数返回的接口 {} 值的类型的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论