Comma-ok断言的语法是:value, ok := element.(T)。element必须是接口类型的变量,T是普通类型。如果断言失败,ok为false,否则ok为true并且value为变量的值。来看个例子:

package mainimport ("fmt"
)type Html []interface{}func main() {html := make(Html, 5)html[0] = "div"html[1] = "span"html[2] = []byte("script")html[3] = "style"html[4] = "head"for index, element := range html {if value, ok := element.(string); ok {fmt.Printf("html[%d] is a string and its value is %s\n", index, value)} else if value, ok := element.([]byte); ok {fmt.Printf("html[%d] is a []byte and its value is %s\n", index, string(value))}}
}

其实Comma-ok断言还支持另一种简化使用的方式:value := element.(T)。但这种方式不建议使用,因为一旦element.(T)断言失败,则会产生运行时错误。如:

package mainimport ("fmt"
)func main() {var val interface{} = "good"fmt.Println(val.(string))// fmt.Println(val.(int))
}

以上的代码中被注释的那一行会运行时错误。这是因为val实际存储的是string类型,因此断言失败。

还有一种转换方式是switch测试。既然称之为switch测试,也就是说这种转换方式只能出现在switch语句中。可以很轻松的将刚才用Comma-ok断言的例子换成由switch测试来实现:

package mainimport ("fmt"
)type Html []interface{}func main() {html := make(Html, 5)html[0] = "div"html[1] = "span"html[2] = []byte("script")html[3] = "style"html[4] = "head"for index, element := range html {switch value := element.(type) {case string:fmt.Printf("html[%d] is a string and its value is %s\n", index, value)case []byte:fmt.Printf("html[%d] is a []byte and its value is %s\n", index, string(value))case int:fmt.Printf("invalid type\n")default:fmt.Printf("unknown type\n")}}
}

GO语言Comma-ok断言相关推荐

  1. C语言学习笔记---断言函数assert()

      在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,接收一个整形表达式作为参数.如果表达式的值为假(非零),则assert()宏就在标准错误流(stderr)中写入一条错 ...

  2. 第十二章 C语言调试_assert断言函数

    在我们的实际开发过程之中,常常会出现一些隐藏得很深的BUG,或者是一些概率性发生的BUG,通常这些BUG在我们调试的过程中不会出现很明显的问题,但是如果我们将其发布,在用户的各种运行环境下,这些程序可 ...

  3. c语言assert_param,STM32断言机制assert_param()宏定义

    我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用. 下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以 ...

  4. 【C语言】assert() 断言的作用

    assert 是宏,而不是函数.它的原型定义在头文件 assert.h 中: void assert( int expression ); 宏 assert 经常用于在函数开始处检验传入参数的合法性, ...

  5. C 语言编程 — 使用 assert 断言进行程序设计

    目录 文章目录 目录 断言 利用断言来提高代码的可测试性 自定义断言来满足需求 尽量在函数中使用断言来检查参数的合法性 避免在断言表达式中使用改变环境的语句 避免使用断言去检查程序错误 在防错性程序设 ...

  6. 断言工具的编写_编写干净的测试–用特定领域的语言替换断言

    断言工具的编写 很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 简洁的代码易于阅读. 这可能会让您感到有些惊讶,但我认为该定义也适用于 ...

  7. 编写干净的测试–用特定领域的语言替换断言

    很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 干净的代码易于阅读. 这可能会让您感到有些惊讶,但是我认为该定义也适用于测试代码. 使 ...

  8. panic函数c语言,【go语言学习】错误error和异常panic

    一.错误和异常的区别 错误指的是可能出现问题的地方出现了问题.比如打开一个文件时失败,这种情况在人们的意料之中 . 异常指的是不应该出现问题的地方出现了问题.比如引用了空指针,这种情况在人们的意料之外 ...

  9. 前端自动化测试之chai.js断言库

    版权声明:本文为博主原创文章,未经博主允许不得转载. chai.js简介 chai.js 是一套TDD(测试驱动开发)/BDD(行为驱动开发)的断言库.包含有3个断言库支持BDD风格的expect/s ...

  10. 单元测试断言库:chai.js中文文档

    原文档地址:https://www.chaijs.com/api/bdd/ BDD风格包含expect和should.它们以相同的链式结构进行断言,它们的不同之处在于初始的断言构造.可以查看风格指南来 ...

最新文章

  1. Opencv-python 3.3版本安装
  2. inter Course Certificate
  3. JavaScript中this的指向问题
  4. lua_string_pattern
  5. Jdk1.8 JUC源码增量解析(1)-atomic-Striped64
  6. java 大文件 处理_用Java处理大文件
  7. 组件化与插件化的差别在哪里?附面试题答案
  8. vue = 什么意思_Vue导入模块import xxx from '@/xxx'中的@是什么含义?
  9. 为MySQL选择合适的备份方式
  10. 开课吧课堂:什么是HashSet类
  11. 小程序之模版消息通知
  12. 6月中国最美的地方!对的时间就要去对的地方!
  13. 百度司南是什么产品?
  14. eclipse 打开jsp页面卡死问题
  15. 解决The APR based Apache Tomcat Native library which allows optimal performance in production environ
  16. 三菱IPM驱动芯片PSS15S92\PSS20S92分析
  17. 怎样做一个iOS App的启动分层引导动画?
  18. anacondaJupyter相关环境配置及常见问题及pycharm快捷命令(很全!很详细)
  19. 内核领域-功耗机型的续航基线优化问题-技术调研报告-王井玉_20211216
  20. 2018新年管理感言

热门文章

  1. VS2017调试程序提示脚本错误解决方法
  2. QT 菜单栏、工具栏和状态栏
  3. java heap space 什么意思_java heap space是什么意思?
  4. HTML5期末大作业:京东商城网站设计——京东商城购物网站(4页) 基于Html+Css+javascript的网页制作(购物主题)
  5. 如何让ARM板开机启动Qt
  6. 【ACM-ICPC 2018 北京赛区网络预赛】B题Tomb Raider ---- 状态压缩+思维★
  7. 实现百度语音识别功能
  8. Android重难点解析——面试中可能被问到的那些问题
  9. 数据库原理与应用~第三版课后习题答案(何玉洁 编著)
  10. 【牛客网-公司真题-前端入门篇】——百度2021校招Web前端研发工程师笔试卷(第二批)