猿问

如何更正“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 类型)


回首忆惘然
浏览 88回答 1
1回答

白猪掌柜的

一个if语句只能与单个类型进行比较,因为它没有像语句这样的分支,并且您必须在这样的语句switch中使用类型断言if:var i interface{}i = 3.3 // store a float64 value in iif 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而没有别的,所以语言规范首先不允许它。
随时随地看视频慕课网APP

相关分类

Go
我要回答