用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)
}