Go接口--类型断言

类型断言

类型断言的用法

类型断言是一个作用在接口值上的操作,作用是从它的操作数中把具体类型的值提取出来,写法如下

1
2
3
a := x.(T)
// x是一个接口类型
// T是一个类型
  • 如果断言成功,那么返回结果(a)就是x的动态值

  • 如果断言失败(类型错误或者接口值为nil),就会触发panic

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    package main

    import "fmt"

    func main() {
    var i interface{} = 10
    t1 := i.(int)
    fmt.Println(t1) // 10

    t2 := i.(string)
    fmt.Println(t2) // panic

    var i interface{}
    var _ = i.(interface{}) // panic


    }
  • 如果接收两个返回值,断言成功的时候,ok为true,断言失败,ok为false,不引发panic,此时t为T的零值

1
2
3
4
5
6
7
8
9
10
11
package main

func main(){
var i interface{} = 10
t, ok := x1.(string)
fmt.Println(t) // ""
if !ok {
fmt.Println("x1 is not a string")
}
}

  1. 当T是一个接口类型的时候:类型断言检查x的动态类型是否满足T,如果检查成功,动态值不会提取出来,结果仍然是一个接口值,接口值得类型和值部分也没有变更。类型断言的结果是接口类型T。

Type Switch

如果需要判断多种类型,使用switch更方便,高效

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
package main

import "fmt"

func interfaceType(i interface{}) {
switch x := i.(type) {
case int:
fmt.Println(x, "int")
case string:
fmt.Println(x, "string")
case nil:
fmt.Println(x, "nil")
default:
fmt.Println(x, "unexpected type")
}
}

func main() {
interfaceType(1) // int
interfaceType("test") // string
interfaceType(12.01) // unexpected type

var i interface{}
interfaceType(i) // nil
}

赋值