提问人:luisepa1420 提问时间:9/1/2023 更新时间:9/1/2023 访问量:51
确定 Golang 中函数返回的接口 {} 值的类型
Determining the type of an interface {} value returned from a function in 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 -> %T\n", execResult) // Prints exec.DataType (the type)
fmt.Printf("VALUE -> %v\n", 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(tree antlr.ParseTree) interface{}
调用该方法后,我收到一个 DataType 类型的值,并在以下行中打印该类型和返回值。
fmt.Printf("TYPE -> %T\n", execResult) // Prints exec.DataType (the type)
fmt.Printf("VALUE -> %v\n", 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
}
}
在这种情况下,交换机中的情况也不满足。我的问题基本上是如何确定从函数调用返回的接口{}值的类型。
答:
1赞
chris.redekop
9/1/2023
#1
我认为@Charlie图马哈伊是对的:问题在于价值不匹配。我在 Go Playground 上尝试了一个小例子,它的工作方式与我们预期的那样:如果从 a 返回,则与 a 的比较可能为真。DataType
Visit
DataType
返回的类型必须为 类型。该方法证明了这一点:它返回一个永远不会等于 的 。DataType
Visit2
int64
BREAK
这在 Go 编程语言规范的比较运算符下进行了介绍:
如果类型 X 具有可比性并且 X 实现了 T,则可以比较非接口类型 X 的值 x 和接口类型 T 的值 T。如果 t 的动态类型与 X 相同,并且 t 的动态值等于 x,则它们相等。
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
}
评论
execResult
值为 5。BREAK 的值为 7。