Go断言

用Go语言提供的类型检测方法,同时也可作为断言的解决方案:

package main

import (
    "fmt"
    "reflect"
)

type MyStruct struct {
}

func (a *MyStruct) Action() {
    fmt.Println("Hello")
}

func main() {
    var M map[string]interface{}
    M = make(map[string]interface{}, 100)
    M["MyStruct"] = &MyStruct{}
    om := M["MyStruct"]            // the type of variable m is interface
    m := om.(*MyStruct)            // so asserts that value restored in m
    fmt.Println(reflect.TypeOf(m)) // *main.MyStruct
    m.Action()
}

m := om.(*MyStruct)

    • 如果om是MyStruct类型,则将转换后的类型赋值给m。
    • 如果MyStruct被定义为一个接口,只要实现了这个接口的对象,此操作都会成功。

不过需要注意的是,如果false了,也就是不匹配,就会产生panic错误。

还有一种不产生错误的方法。

  m, ok := om.(*MyStruct)

使用两个变量接受返回值,如果ok为false,则m为零值,但是不会报错。

因此你可以这样来进行错误处理:

if !ok {
    fmt.Println("Type not matched!")
    os.Exit(1)
}

  

posted @ 2016-10-20 09:34  丹江流  阅读(300)  评论(0编辑  收藏  举报