1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
type I interface {
f()
}
type T string
func (t T) f() {
fmt.Println("T Method")
}
type Stringer interface {
String() string
}
func main() {
// 类型断言
var varI I = T("Tstring")
// 1. 非空接口.(具体类型)
// 如果断言成功,v是varL转换到类型I的值,ok的值是true
// 否则v是类型T的零值,ok的值是false,也没有运行时错误发生
if v, ok := varI.(T); ok {
fmt.Println("varI类型断言结果为:", v)
v.f()
}
// Output:
// varI类型断言结果为: Tstring
// T Method
// Type-Switch 做类型断言
var value interface{}
// value.(type) 只能在switch中使用,会依次检查case的值进行断言,如value.(string)再试value.(Stringer)、value.(int) 等
// 这种形式下不允许使用 fallthrough 关键字
// 在处理未知类型的数据(例如解析JSON等编码的数据)更加方便
switch str := value.(type) { // str 是断言出来的值也就是 eface.data
case string:
fmt.Println("string:", str)
case Stringer:
fmt.Println("Stringer:", str)
case int,uint,float32,float64:
fmt.Println("我是上面类型其中一个")
case nil:
fmt.Println("nil")
default:
fmt.Println("value类型不在上面中")
}
// Output:
// nil
// Comma-ok 断言
// 断言是否是某个具体的类型 其实上面的 value.(type) 就是这种形式的组合
value = "类型断言检查"
if str, ok := value.(string); ok {
fmt.Printf("value类型断言结果为:%T\n", str) // str已近转为string类型
} else {
fmt.Printf("value 不是 string 类型 \n")
}
// Output:
// value类型断言结果为:string
}
|