go:interface{}、断言与类型转换
interface{}可用于向函数传递任意类型的变量,但对于函数内部,该变量仍然为interface{}类型(空接口类型),
不清楚这点将可能导致错误。如以下代码:
package main
import "fmt"
/*
**用于输出数组元素
*/
func echoArray(a interface{}){
for _,v:=range a{
fmt.Print(v," ")
}
fmt.Println()
return
}
func main(){
a:=[]int{2,1,3,5,4}
echoArray(a)
}
//以上代码将会报错,因为对于echoArray()而言,a是interface{}类型,而不是[]int类型
接口类型向普通类型的转换称为类型断言(运行期确定)-------摘自《Go语言的类型转换和类型断言》 http://my.oschina.net/chai2010/blog/161418
其它参考:http://blog.csdn.net/jonnyhsu/article/details/41148753
所以前面代码中,将echoArray()做如下修改即可:
func echoArray(a interface{}){
b,_:=a.([]int)//通过断言实现类型转换
for _,v:=range b{
fmt.Print(v," ")
}
fmt.Println()
return
}
-----------------------15/11/8更新---------------------------------
注意:在使用断言时最好用
b,ok:=a.([]int)
if ok{
...
}
的形式,这样能根据ok的值判断断言是否成功。
因为断言失败在编译阶段不会报错,所以很可能出现断言失败导致运行错误,而你却迟迟找不到原因(亲身经历)。
-----------------------15/11/21更新-----------------------------
注意:不同类型变量的运算必须进行显式的类型转换,否者结果可能出错,如下例:
func main() {
var a uint8 = 8
c := a * 32
fmt.Println(a*32, c)
fmt.Println(reflect.TypeOf(c))
d := a * 31
fmt.Println(a*31, d)
fmt.Println(reflect.TypeOf(d))
return
}
/* 输出:
** 0 0
** uint8
** 248 248
** uint8
*/
a*32的结果为0,原因是uint8可以表示的最大值为255( 1111 1111 ),而a*32的值为256(1 0000 0000 ),舍弃溢出的高位后即为0
也就是说,go不自动根据a*32的结果为其赋予合适的类型,而是根据a的类型强制其为uint8,所以最终c 和 d 的类型也为uint8。
总结:
1.interface{}使得我们可以向函数传递任意类型的变量;
2.断言解决在使用interface{}的情况下,空接口类型向普通类型转换的类型转换问题;
3.普通类型之间的转换最好使用显式的类型转换,否者很可能导致严重的错误。
4.以上是我个人的理解,希望各位没有被我绕糊涂
-----------------------------------------------------
* 本文是根据自身经验所作,难免存在不合理之处。
go:interface{}、断言与类型转换的更多相关文章
- [Golang学习笔记] 06 程序实体3 类型断言和类型转换
类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...
- Go interface 原理剖析--类型转换
hi, 大家好,我是 haohognfan. 可能你看过的 interface 剖析的文章比较多了,这些文章基本都是从汇编角度分析类型转换或者动态转发.不过随着 Go 版本升级,对应的 Go 汇编也发 ...
- golang学习之interface与其它类型转换
如下函数,将interface变量in转换为int: func formatTimeStamp(in interface{}, layout string) (out string) { timeSt ...
- Go interface{}、类型断言
在 golang 中 interface{} 可用于向函数传递任意类型的变量, 但在函数内部使用的话, 该变量的类型就是 interface{}, 也称为空接口类型 比如我们定义一个函数, 输出字符串 ...
- TypeScript 入门自学笔记 — 类型断言(二)
码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14558034.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ...
- TypeScript入门-高级类型
高级类型 交叉类型 交叉类型,就是将多个类型合并为一个新的类型,这个新的类型具有这多个类型的成员,含有这几个类型的所有特性,是他们的综合体,像是集合的并集 例子: function extend< ...
- 来自朝鲜的问候 golang入坑系列
鸿渐于陆 本想着写满十八式,但按照目前的进度来看,是很难凑够十八式了.所以还是那句话,量力而行,适可而止.能写多少就写多少,我没法保证看完这本golang脱口秀,一定能成为golang大拿.但入了门, ...
- Go 开发
0.参数传递永远是值传递,地址也是一种值 1.go 开发环境的配置 2.import 包的几种形式: 1)_,默认导入一个包时,会将包中内容导入再执行包中的init()方法,有时并不需要某个包,只是想 ...
- 一文学会 TypeScript 的 82% 常用知识点(上)
前端专栏 2019-11-22 19:17:55 对于前端从业者来说,TypeScript(以下简称 TS)已经不算是新技术. Vue3 的源码基于 TS 编写, Angular 项目默认支持 TS ...
随机推荐
- 使用s3cmd操作ceph rgw
安装1.sudo apt-get install -y python-pip sudo pip install s3cmd 2. sudo apt-get install s3cmd 配置 s3c ...
- 更好的pip工作流
转自:http://codingpy.com/article/a-better-pip-workflow-recommended-by-kenneth/ 现在大家开发Python应用时,在代码库的根目 ...
- Redis集群(三):主从配置一
一.本文目的 Redis的主从配置分为两篇文章,第一篇主要介绍了Redis主从配置的搭建过程及使用,第二篇主要说明各种情况下Redis主从状态,如Master挂掉,Slaver挂掉, ...
- JavaScript中URL的解码和编码
这些URI方法encodeURI.encodeURIComponent().decodeURI().decodeURIComponent()代替了BOM的escape()和unescape()方法. ...
- BZOJ 2946: [Poi2000]公共串
2946: [Poi2000]公共串 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 787 Solved: 342[Submit][Status][D ...
- 对前端的一个H5项目的所思所想
最近接触一个前端HTML5的项目,虽然我主做iOS,但曾经也徒手用html+css+js+php写过一个博客,当然表示无压力了.结果.现在的前端发展的速度真是快啊,项目中用到Jquery,reactJ ...
- sqlalchemy入门记录
前言 发现翻译全文时间比较久,所以先整个简单的使用说明吧 安装SQLAlchemy pip install sqlalchemy 查看SQLAlchemy版本 In [1]: import sqlal ...
- iOS苹果推送功能实现步骤
1.在钥匙串里 导出推送证书Apple Push notification Services 的 certificate, 命名为cer.p12,放在电脑桌面 ,期间密码设为123456 2.在钥匙串 ...
- rails
http://ruby-toolbox.com/ ~/.gemrc --- :backtrace: false :benchmark: false :bulk_threshold: 1000 :sou ...
- 【原】十张javascript思维导图
下面附上十张javascript思维导图,如果把里面的内容全部掌握,那就是高手了.思维导图提供给我们一个整体的知识体系,也可以说是一种工具,废话不多说,上图: 1.javascript数据类型 2.j ...