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

  

转载于:https://www.cnblogs.com/logo-fox/p/5979541.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值