类型断言

题目:

下面这段代码能否编译通过?如果可以,输出什么?

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 是固定关键字,需要注意的是,只有接口类型才可以使用类型断言。


类型断言
http://example.com/2023/06/04/Go每日一题/类型断言(2)/
作者
Feng Tao
发布于
2023年6月4日
更新于
2023年6月4日
许可协议