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

  

Go断言的更多相关文章

  1. iOS-----程序异常处理----- 断言NSAssert()和NSParameterAssert区别和用处

    NSAssert和assert是断言,主要的差别是assert在断言失败的时候只是简单的终止程序,而NSAssert会报告出错误信息并且打印出来.所以尽管的使用NSAssert,可以不去使用asser ...

  2. GO语言总结(5)——类型转换和类型断言

    上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到 ...

  3. postman 断言解析

    最近在学习postman官方文档, 顺势翻译出来,以供学习! postman断言是JavaScript语言编写的,在postman客户端指定区域编写即可. 断言会在请求返回之后,运行,并根据断言的pa ...

  4. 测试框架Mocha与断言expect

    测试框架Mocha与断言expect在浏览器和Node环境都可以使用除了Mocha以外,类似的测试框架还有Jasmine.Karma.Tape等,也很值得学习. 整个项目源代码: 为什么学习测试代码? ...

  5. JavaScrict中的断言调试

    今天在看忍者秘籍的时候,看到一个断言方法.查阅了一下资料,原来javascript中的console也包含这个方法.具体用法如下: <script type="text/javascr ...

  6. 断言与异常(Assertion Vs Exception)

    在日常编程实践中,断言与异常的界限不是很明显,这也使得它们常常没有被正确的使用.我也在不断的与这个模糊的怪兽搏斗,仅写此文和大家分享一下我的个人看法.我想我们还可以从很多角度来区别断言和异常的使用场景 ...

  7. 断言(Assert)与异常(Exception)

    断言是被用来检查非法情况而不是错误情况,即在该程序正常工作时绝不应该发生的非法情况,用来帮助开发人员对问题的快速定位.异常处理用于对程序发生异常情况的处理,增强程序的健壮性.容错性,减少程序使用中对用 ...

  8. Linux Kernel 代码艺术——编译时断言

    本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码片段(不关注OS的各个模块的设计思想,此部分我准备写在“深入理解Linux Kernel” 系列文章中),一来通过内核 ...

  9. selenium自动化-java-封断言类2

    封装断言类 package streamax.com; import java.util.ArrayList; import java.util.List; import org.testng.Ass ...

  10. selenium自动化-java-封装断言

    封装的断言. 1 package com.baidu.www; import org.testng.Assert; /* * 封装断言 */ public class assertion { stat ...

随机推荐

  1. Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager

    8.初始化管理器BlockManager 无论是Spark的初始化阶段还是任务提交.执行阶段,始终离不开存储体系.Spark为了避免Hadoop读写磁盘的I/O操作成为性能瓶颈,优先将配置信息.计算结 ...

  2. 【转载】C# List用法 List介绍

    https://www.cnblogs.com/dyhao/p/9501479.html

  3. C# RestoreDirectory

    OpenFileDialog与SaveFileDialog都有RestoreDirectory属性,这个属性默认是false,打开一 个文件后,那么系统默认目录就会指向刚才打开的文件.如果设为true ...

  4. Metaprogramming

    Metaprogramming https://en.wikipedia.org/wiki/Metaprogramming 元编程, 是一种编程技术, 制造的计算机程序,具有这种能力, 对待程序为他们 ...

  5. ES6 快速开始

    Refs 现代框架 Vue React 都使用到了 ES6 (包括D3js) [常量] // ES5 中常量的写法 Object.defineProperty(window, "PI2&qu ...

  6. hashMap源码解析(四)

    ---恢复内容开始--- 在上文中讲到了putval这个方法,这里继续: final V putVal(int hash, K key, V value, boolean onlyIfAbsent, ...

  7. clam安装

    nodejs下,npm安装clam指令: npm  install  -g  clam

  8. 实验吧 ASCII艺术

    题目链接:http://ctf5.shiyanbar.com/ppc/acsii.php 首先我们先理清题意,题目的意思是将下面这样这些小叉叉组成的数字,连起来输入得到flag,并且要在两秒以内. 两 ...

  9. java程序中默认浮点形值常量是什么类型的?如何区分不同类型的浮点型整数值常量?

    java程序中默认浮点形值常量是什么类型的 默认的所有的浮点型数值都是double型

  10. Linux 学大纲