GO语言Comma-ok断言
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断言相关推荐
- C语言学习笔记---断言函数assert()
在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,接收一个整形表达式作为参数.如果表达式的值为假(非零),则assert()宏就在标准错误流(stderr)中写入一条错 ...
- 第十二章 C语言调试_assert断言函数
在我们的实际开发过程之中,常常会出现一些隐藏得很深的BUG,或者是一些概率性发生的BUG,通常这些BUG在我们调试的过程中不会出现很明显的问题,但是如果我们将其发布,在用户的各种运行环境下,这些程序可 ...
- c语言assert_param,STM32断言机制assert_param()宏定义
我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用. 下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以 ...
- 【C语言】assert() 断言的作用
assert 是宏,而不是函数.它的原型定义在头文件 assert.h 中: void assert( int expression ); 宏 assert 经常用于在函数开始处检验传入参数的合法性, ...
- C 语言编程 — 使用 assert 断言进行程序设计
目录 文章目录 目录 断言 利用断言来提高代码的可测试性 自定义断言来满足需求 尽量在函数中使用断言来检查参数的合法性 避免在断言表达式中使用改变环境的语句 避免使用断言去检查程序错误 在防错性程序设 ...
- 断言工具的编写_编写干净的测试–用特定领域的语言替换断言
断言工具的编写 很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 简洁的代码易于阅读. 这可能会让您感到有些惊讶,但我认为该定义也适用于 ...
- 编写干净的测试–用特定领域的语言替换断言
很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 干净的代码易于阅读. 这可能会让您感到有些惊讶,但是我认为该定义也适用于测试代码. 使 ...
- panic函数c语言,【go语言学习】错误error和异常panic
一.错误和异常的区别 错误指的是可能出现问题的地方出现了问题.比如打开一个文件时失败,这种情况在人们的意料之中 . 异常指的是不应该出现问题的地方出现了问题.比如引用了空指针,这种情况在人们的意料之外 ...
- 前端自动化测试之chai.js断言库
版权声明:本文为博主原创文章,未经博主允许不得转载. chai.js简介 chai.js 是一套TDD(测试驱动开发)/BDD(行为驱动开发)的断言库.包含有3个断言库支持BDD风格的expect/s ...
- 单元测试断言库:chai.js中文文档
原文档地址:https://www.chaijs.com/api/bdd/ BDD风格包含expect和should.它们以相同的链式结构进行断言,它们的不同之处在于初始的断言构造.可以查看风格指南来 ...
最新文章
- Opencv-python 3.3版本安装
- inter Course Certificate
- JavaScript中this的指向问题
- lua_string_pattern
- Jdk1.8 JUC源码增量解析(1)-atomic-Striped64
- java 大文件 处理_用Java处理大文件
- 组件化与插件化的差别在哪里?附面试题答案
- vue = 什么意思_Vue导入模块import xxx from '@/xxx'中的@是什么含义?
- 为MySQL选择合适的备份方式
- 开课吧课堂:什么是HashSet类
- 小程序之模版消息通知
- 6月中国最美的地方!对的时间就要去对的地方!
- 百度司南是什么产品?
- eclipse 打开jsp页面卡死问题
- 解决The APR based Apache Tomcat Native library which allows optimal performance in production environ
- 三菱IPM驱动芯片PSS15S92\PSS20S92分析
- 怎样做一个iOS App的启动分层引导动画?
- anacondaJupyter相关环境配置及常见问题及pycharm快捷命令(很全!很详细)
- 内核领域-功耗机型的续航基线优化问题-技术调研报告-王井玉_20211216
- 2018新年管理感言
热门文章
- VS2017调试程序提示脚本错误解决方法
- QT 菜单栏、工具栏和状态栏
- java heap space 什么意思_java heap space是什么意思?
- HTML5期末大作业:京东商城网站设计——京东商城购物网站(4页) 基于Html+Css+javascript的网页制作(购物主题)
- 如何让ARM板开机启动Qt
- 【ACM-ICPC 2018 北京赛区网络预赛】B题Tomb Raider ---- 状态压缩+思维★
- 实现百度语音识别功能
- Android重难点解析——面试中可能被问到的那些问题
- 数据库原理与应用~第三版课后习题答案(何玉洁 编著)
- 【牛客网-公司真题-前端入门篇】——百度2021校招Web前端研发工程师笔试卷(第二批)