题目:
下面这段代码能否编译通过?如果可以,输出什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| func GetValue() int { return 1 }
func main() { i := GetValue() switch i.(type) { case int: println("int") case string: println("string") case interface{}: println("interface") default: println("unknown") } }
|
答案解析
该代码无法编译通过。
原因是在 switch i.(type)
语句中,i
是一个普通的 int
类型变量,而 i.(type)
只能用于接口类型的断言。因此,编译器会报错。
如果想要判断一个变量的类型,可以使用 reflect
包来实现。以下是修改后的代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import ( "fmt" "reflect" )
func GetValue() int { return 1 }
func main() { i := GetValue() switch reflect.TypeOf(i).Kind() { case reflect.Int: fmt.Println("int") case reflect.String: fmt.Println("string") default: fmt.Println("unknown") } }
|
以下解析来自 Go语言中文网
编译失败。考点:类型断言,类型断言的语法形如:i.(type),其中 i 是接口,type 是固定关键字,需要注意的是,只有接口类型才可以使用类型断言。