文章目录

  • 1.类型转换
  • 2.类型断言
  • 3.类型选择
  • 参考文献

Go 是一种静态类型的编译型语言,每一个变量在使用时都有明确的类型与之对应。Go 中,关于数据类型,主要有三点容易让人迷惑,分别是类型转换、类型断言和类型选择,下面分别讲解,并给出相应示例。

1.类型转换

Go 中不同类型变量间进行赋值是不允许的,即编译时会出现编译错误。Go 语言崇尚“显式表达,避免隐含”的设计思想,不允许隐式类型转换,因此相互兼容的不同类型间的赋值需要开发人员进行类型转换操作。类型转换语法格式如下:

<结果类型变量>:=<目标类型>(<表达式>)

参考如下示例:

package mainimport "fmt"func main(){var var1 float32 = 4.4fmt.Printf("%T->%v\n", var1, var1)var2 := float64(var1)var3 := int32(var1)fmt.Printf("%T->%v\n", var2, var2)fmt.Printf("%T->%v\n", var3, var3)//var4 := []byte(var1)      //cannot convert var1 (type float32) to type []byte
}

程序输出:

float32->4.4
float64->4.400000095367432
int32->4

需要注意两点:
(1)当类型不兼容的时候是无法转换的,比如上例中的var4 := []byte(var1)会报编译错误;
(2)非数值间相互转换不会丢失精度,数值间相互转换就需要考虑精度可能丢失的情况。比如上例中将float32转为int32,将丢失小数点后的小数部分。

2.类型断言

在处理由外部传入的数据时,想要创建一个通用函数在进行面向对象编程时,我们需要使用 interface{} 类型,即空接口类型。由于空接口类型中不包含任何方法,所以 Go 中的所有类型都实现了 interface{}。我们可以使用类型断言将一个 interface{} 类型的值转换为实际数据的值,即类型断言接受一个接口值, 并从中提取指定的明确类型的值。

使用类型断言有以下两种方式:

// 安全类型断言,失败 value 则为类型 T 的零值
value, ok := expression.(T) // 非安全类型断言,失败时会 panic
value := expression.(T)

使用示例:

func main() {var a interface{} = 1var b interface{} = "abc"c,ok := a.(int)d := b.(string)fmt.Println(c, ok)fmt.Println(d)
}

输出结果:

1 true
abc

3.类型选择

通过 interface{} 接收的变量类型可能有多种,此时我们需要进行类型选择,即使用 switch 配合类型选择,分发到具体情况(case)进行处理。

参考如下示例:

package mainimport "fmt"func main(){var b bool=truevar f64 float64=4.4var str string="dablelv"var i int=4var slice []byteclassifier(b,f64,str,i,slice)
}func classifier(items ...interface{}){for i,v := range items {switch v.(type) {case bool:fmt.Printf("index=#%d value=%v is bool\n",i,v)case float64:fmt.Printf("index=#%d value=%v is float64\n",i,v)case string:fmt.Printf("index=#%d value=%v is string\n",i,v)case int:fmt.Printf("index=#%d value=%v is int\n",i,v)default:fmt.Printf("index=#%d value=%v is %T\n",i,v,v)}}
}

输出结果:

index=#0 value=true is bool
index=#1 value=4.4 is float64
index=#2 value=dablelv is string
index=#3 value=4 is int
index=#4 value=[] is []uint8

参考文献

[1] Go编程语言.实效Go编程
[2] Go语言 类型转换,类型断言,类型开关

Go 类型转换、类型断言与类型选择相关推荐

  1. Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)

    1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...

  2. channel 管道 接收和输出数据 使用类型断言进行类型的转换

    首先定义一个Cat结构体 import ("fmt" )type Cat struct {Name stringAge int } 因为接受的都是空接口类型,所以在输出的时候如果按 ...

  3. 类型转换与类型断言之间的区别

    搜罗了一下类型转换与类型断言之间的区别,还有类型断言一个返回值与两个返回值之间的区别 1.类型转换(1).语法:<结果类型> := <目标类型> ( <表达式> ) ...

  4. TypeScript中的联合类型、类型别名、接口、类型断言

    一.联合类型 在TypeScript中,联合类型(Union Types)是指用"|"符号将多个类型组合成一个的类型.这种类型可以包含不同的类型,例如字符串.数字或对象.这些不同类 ...

  5. 【TypeScript专题】之类型断言

    [TypeScript 专题]之类型断言 断言是编程术语,表示为一些布尔表达.-- 百度百科 系列文章,收藏不走丢哦 类型断言(Type Assertion)可以用来手动指定一个值的类型.就是告诉编译 ...

  6. golang类型断言的使用(Type Assertion)

    第一部分 首先,转自https://studygolang.com/articles/3314对断言的基本介绍 golang的语言中提供了断言的功能.golang中的所有程序都实现了interface ...

  7. typescript 数据类型、函数返回值、类型断言、联合类型、类型兼容

    null和undefined类型:是所有类型的子类型,即可以将任意类型赋值为二者any类型:可以赋值任何类型unknown类型:引入的顶级类型unknown,对照于any,unknown是类型安全的, ...

  8. golang: 类型转换和类型断言

    类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编译器不会 ...

  9. TypeScript的类型断言,有点像ABAP的强制类型转换

    通过类型断言这种方式可以告诉编译器,"相信我,我知道自己在干什么". 类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构. 它没有运行时的影响,只是在编译阶段起作用. ...

最新文章

  1. 今晚 8 点直播 | OpenCV 20 年,首款开源软硬一体的 OAK 套件来了!
  2. 陪伴程序员的一条龙、一骑士 36 岁了!
  3. oracle视图的同义词,oracle 视图、同义词、序列
  4. C++中字符型和整型的关系
  5. python段子_Python爬取内涵段子里的段子
  6. 【clickhouse】Code: 135. DB::Exception: Received from xxx:9000. DB::Exception: Indices in strings are
  7. HappyAA服务器部署笔记1(nginx+tomcat的安装与配置)
  8. java ajax动态加载数据_java实现的highcharts与ajax结合动态实时获取数据更新图表
  9. 有关PyCharm的破解安装
  10. CSDN Markdown 图片排版显示
  11. 用java设计族谱家谱制_家谱网站的设计与实现.doc
  12. 计算机高级培训教师感言,教师信息技术培训感言信息技术培训心得多篇.docx
  13. 了解交换机、路由器、网关的概念以及它们各自属于什么层次?
  14. 安卓libc setenv函数内存泄漏
  15. PowerShell的基本使用方法
  16. idea 安装vue.js插件
  17. 为listview、或者recyclerView的item增加进场动画
  18. 2012 ACM 亚洲区总结帖
  19. 7-1 立方体类的实现 (20分)
  20. Git安装(Msysgit)

热门文章

  1. 初译 Support Vector Machines:A Simple Tutorial(一)
  2. 【完全开源】博客园客户端UWP版(上篇)
  3. python操作日期和时间的方法
  4. EIGRP路由汇总与安全性配置
  5. CentOS Repos
  6. java多线程设计wait、notify、notifyall、synchronized的使用机制
  7. 虚拟机ping不通主机与外网的解决方法
  8. clion eap 预览版 免费版
  9. GDB 调试命令讲解-转
  10. 30个类仿真手写spring框架V2.0版本