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而没有别的,所以语言规范首先不允许它。
- 1 回答
- 0 关注
- 87 浏览
添加回答
举报