如何解决如何更正“ if”构造中的类型比较
我尝试使用“反射”和“(类型)”
var a float64 = 6.0
if reflect.TypeOf(a) == float64 {
fmt.Printf("%T",a)
}
switch a.(type) {
case float64:
fmt.Printf("%T",a)
}
但都返回了错误
错误1:类型float64不是表达式
错误2:无法在非接口值a(类型为float64)上输入类型
解决方法
if
语句只能与单个类型进行比较,因为它没有像switch
语句那样的分支,并且您必须在{{1}中使用type assertion }这样的语句:
if
这将输出(在Go Playground上尝试):
var i interface{}
i = 3.3 // store a float64 value in i
if f,ok := i.(float64); ok {
fmt.Print("It's a float64 value: %.2f",f)
} else {
fmt.Println("Not float64")
}
您也可以使用反射,但是此处的类型断言更加有效且惯用。供参考,这是使用反射的样子:
It's a float64 value: 3.30
输出是相同的。在Go Playground上尝试这个。
请注意,当我们使用类型断言时,我们拥有断言类型(if reflect.TypeOf(i) == reflect.TypeOf(float64(0)) {
fmt.Printf("It's a float64 value: %.2f",i)
} else {
fmt.Println("Not float64")
}
)的变量f
,因此,如果某些函数直接需要该类型的值,则可以使用它。使用反射时,我们没有这种类型的值,float64
是类型i
的“静止”,我们可以使用它,因为interface{}
的值为fmt.Printf()
。但是,如果我们必须将其传递给需要interface{}
的函数,则仍然需要使用(附加)类型断言,就像在第一个示例中一样。
还请注意,只有在您的输入是接口类型时,才使用类型断言和类型切换才有意义,因为只有接口类型才能存储不同/多个具体类型的值。
在具体类型上使用类型断言或类型切换(例如您示例中的float64
值)没有意义,因为该值只能是float64
类型,因此语言规范没有首先不允许它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。