为了账号安全,请及时绑定邮箱和手机立即绑定

如何更正“if”构造中的类型比较

如何更正“if”构造中的类型比较

Go
回首忆惘然 2022-06-27 10:46:07
我尝试使用“反射”和“(类型)”var a float64 = 6.0if reflect.TypeOf(a) == float64 {    fmt.Printf("%T", a)}switch a.(type) {case float64:    fmt.Printf("%T", a)}但两者都返回错误错误 1:float64 类型不是表达式错误 2:无法在非接口值 a 上输入开关(float64 类型)
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

一个if语句只能与单个类型进行比较,因为它没有像语句这样的分支,并且您必须在这样的语句switch中使用类型断言if:


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")

}

这将输出(在Go Playground上尝试):


It's a float64 value: 3.30

您也可以使用反射,但这里的类型断言更有效且更惯用。作为参考,这是使用反射的样子:


if reflect.TypeOf(i) == reflect.TypeOf(float64(0)) {

    fmt.Printf("It's a float64 value: %.2f", i)

} else {

    fmt.Println("Not float64")

}

输出是一样的。在Go Playground上试试这个。


请注意,当我们使用类型断言时,我们有一个f断言类型 ( float64) 的变量,因此如果某些函数直接需要该类型的值,我们可以使用它。使用反射时,我们没有这种类型的值,i“仍然”是 type interface{},我们可以使用它,因为fmt.Printf()它的值是interface{}。但是如果我们必须将它传递给需要的函数float64,我们仍然需要使用(附加的)类型断言,就像在第一个示例中一样。


另请注意,仅当您的输入是接口类型时,使用类型断言和类型切换才有意义,因为只有接口类型可能存储不同/多个具体类型的值。


在具体类型(如您的示例中的值)上使用类型断言或类型开关float64没有任何意义,因为该值可能只是类型float64而没有别的,所以语言规范首先不允许它。


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信