go语言学习笔记 — 进阶 — 接口:空接口类型interface{} —— 能保存所有值
Posted Locutus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 进阶 — 接口:空接口类型interface{} —— 能保存所有值相关的知识,希望对你有一定的参考价值。
空接口是接口类型的特殊形式。空接口没有任何方法,因此任何类型都无法实现空接口。
从实现角度看,任何值都满足空接口的需求,因此空接口可以保存任何值,也可以从空接口中取出原值。
注:空接口类似于C语言中的void*,在泛型和模板出现前,空接口是一种非常灵活的数据抽象保存和使用方法。空接口的内部实现保存了对象的类型和指针。使用空接口保存一个数据的过程,会比直接使用对应数据类型的变量保存稍慢,因此在开发中,应在需要的地方使用空接口,而不是所有地方都使用空接口。
1. 把值保存到空接口中
interface{}类型表示空接口,这种接口可以保存任何类型的数据。
var any interface{}
any = 1
fmt.Println(any)
any = "hello"
fmt.Println(any)
any = false
fmt.Println(any)
2. 从空接口中获取值
如果直接取出保存到空接口的值,会报编译错误。
var a int = 1
var i interface{} = a
var b int = i
运行上述代码会报错,提示不能直接使用空接口类型interface{}的变量i赋值给整型变量b。把变量a的值赋给i时,虽然i的内部值是int,但i还是一个interface{}类型的变量。类似地,无论集装箱装的是茶叶还是烟草,集装箱依然是金属做的,不会因为所装物的类型而改变。
var a int = 1
var i interface{} = a
var b int = i.(int)
因此,我们需要使用类型断言,使b获取空接口i中保存变量a的值:1。
3. 比较空接口的值
空接口在保存不同的值后,可以和其他变量一样使用==进行比较。空接口的比较有以下几种特性。
- 比较包含不同类型的空接口,结果不相等
比较保存有不同类型值的空接口,go会优先比较值的类型。因此类型不同,比较的结果也不相等。
var a interface{} = 100 // 空接口a保存整型
var b interface{} = "hi" // 空接口b保存字符串
fmt.Println(a == b) // 两个空接口不相等
- 不能比较空接口中的动态类型值
当接口中保存有动态类型值时,运行代码会触发错误。
var c interface {} = []int{10} // c保存有包含10的整型切片
var d interface {} = []int{20} // d保存有包含20的整型切片
fmt.Println(c == d) // 触发panic
提示[]int是不可比较类型。
以上是关于go语言学习笔记 — 进阶 — 接口:空接口类型interface{} —— 能保存所有值的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 进阶 — 接口(3.2):接口与类型的关系 —— 多个类型可以实现一个(相同)接口
go语言学习笔记 — 进阶 — 接口(3.1):接口与类型的关系 —— 一个类型可以实现多个接口