调用函数时的隐式转换
Go 语言中的函数调用都是值传递的,变量会在方法调用前进行类型转换。
import (
"fmt"
)
// 类型转换为interface类型
func printType(i interface{}) {
//Go把传入函数的参数值的类型隐式的转换成 interface{} 类型。
// interface类型才能进行类型断言
switch i.(type) {
case int:
fmt.Println("参数的类型是 int")
case string:
fmt.Println("参数的类型是 string")
}
}
// 不报错
func main() {
a := 10
printType(a) // 参数的类型是 int
}
但是如果是下面这个
package main
import "fmt"
func main() {
a := 10
// 因为a是int类型 不是interface类型所以报错
// panic
switch a.(type) {
case int:
fmt.Println("参数的类型是 int")
case string:
fmt.Println("参数的类型是 string")
}
}
解决办法:进行接口类型的显示转换
var a int = 25
b := interface{}(a)
package main
import "fmt"
func main() {
a := 10
//不报错 运行正常
switch interface{}(a).(type) {
case int:
fmt.Println("参数的类型是 int")
case string:
fmt.Println("参数的类型是 string")
}
}
类型断言中的隐式转换
只有静态类型为接口类型的对象才可以进行类型断言,而当类型断言完成后,会返回一个静态类型为你断言的类型的对象,也就是说,当我们使用了类型断言,Go 实际上又会默认为我们进行了一次隐式的类型转换。
func main() {
a := 10
//不报错 运行正常
switch b := interface{}(a).(type) {
case int:
b.(int) // error b为int类型
fmt.Println("参数的类型是 int")
case string:
fmt.Println("参数的类型是 string")
}
}