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