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{}、断言与类型转换的更多相关文章

  1. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  2. Go interface 原理剖析--类型转换

    hi, 大家好,我是 haohognfan. 可能你看过的 interface 剖析的文章比较多了,这些文章基本都是从汇编角度分析类型转换或者动态转发.不过随着 Go 版本升级,对应的 Go 汇编也发 ...

  3. golang学习之interface与其它类型转换

    如下函数,将interface变量in转换为int: func formatTimeStamp(in interface{}, layout string) (out string) { timeSt ...

  4. Go interface{}、类型断言

    在 golang 中 interface{} 可用于向函数传递任意类型的变量, 但在函数内部使用的话, 该变量的类型就是 interface{}, 也称为空接口类型 比如我们定义一个函数, 输出字符串 ...

  5. TypeScript 入门自学笔记 — 类型断言(二)

    码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14558034.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ...

  6. TypeScript入门-高级类型

    高级类型 交叉类型 交叉类型,就是将多个类型合并为一个新的类型,这个新的类型具有这多个类型的成员,含有这几个类型的所有特性,是他们的综合体,像是集合的并集 例子: function extend< ...

  7. 来自朝鲜的问候 golang入坑系列

    鸿渐于陆 本想着写满十八式,但按照目前的进度来看,是很难凑够十八式了.所以还是那句话,量力而行,适可而止.能写多少就写多少,我没法保证看完这本golang脱口秀,一定能成为golang大拿.但入了门, ...

  8. Go 开发

    0.参数传递永远是值传递,地址也是一种值 1.go 开发环境的配置 2.import 包的几种形式: 1)_,默认导入一个包时,会将包中内容导入再执行包中的init()方法,有时并不需要某个包,只是想 ...

  9. 一文学会 TypeScript 的 82% 常用知识点(上)

    前端专栏 2019-11-22 19:17:55 对于前端从业者来说,TypeScript(以下简称 TS)已经不算是新技术. Vue3 的源码基于 TS 编写, Angular 项目默认支持 TS ...

随机推荐

  1. Uncaught Error: Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)

    引用bootstrap之后报这个错误,错误出在bootstrap.js文件中,原语句是: if(void 0===window.Tether) throw new Error("Bootst ...

  2. Dedecms去掉URL中a目录的方法

    本文实例讲述了Dedecms去掉URL中a目录的方法.分享给大家,供大家参考.具体分析如下: 使用dedecms的朋友可能会发现自己的URL目录生成是会自动带有一个/A/目录了,那么要如何去掉URL中 ...

  3. Android基础总结(一)

    Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包,导入此包方可使用 ...

  4. C语言拾遗(一)

    越来越体会到C语言的重要性,不管是在计算机底层的理解上,还是在算法数据结构上,所以遂决定重新拾起C语言,不定期更新一些知识点. 推荐博客:http://blog.csdn.net/itcastcpp ...

  5. jenkins持续集成源码管理选项为None,构建失败找不到git.exe解决办法

    我的jenkins版本为Jenkins ver. 2.19.1 1.源码管理选项只有None的解决办法: 在插件管理中心,搜索对应的源码管理插件这里以git为例,搜索git plugin点击右下角的安 ...

  6. python基础回顾1

    定义 tuple(元组), list (表) #!/usr/bin/env python # encoding: utf-8 a = 10 #定义一直变量,无需声明 s1 = (2,1.3,'love ...

  7. Windows 新装进阶操作指南

    Windows禁用CTRL+Space切换输入法 注册表打开HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000010 把Key Mo ...

  8. UnixC学习小结

    1.malloc工作原理:     malloc使用一个数据结构(链表)维护分配空间     链表的构成:分配的空间/上一个空间数据/下一个空间/空间大小等信息.     对malloc分配的空间不要 ...

  9. mysql安装和配置

    一.下载mysql mysql下载页 我用的是5.6,点击旁边的"Looking for previous GA versions?"按钮就能看到5.6版本 mysql-5.6.3 ...

  10. TypeScript Writing .d.ts files(编写声明文件)

    当使用扩展的JavaScript库或者插件API的时候,将需要使用声明文件(.d.ts)来描述库的类型.本文内容将包括如何编写声明文件相关的一些高级概念,然后用一些例子来展示如何将各式各样的概念与声明 ...