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语言学习笔记 — 进阶 — 接口:在接口和类型之间转换

go语言学习笔记 — 进阶 — 接口:接口声明

go语言学习笔记 — 进阶 — 接口(3.2):接口与类型的关系 —— 多个类型可以实现一个(相同)接口

go语言学习笔记 — 进阶 — 接口(3.1):接口与类型的关系 —— 一个类型可以实现多个接口

go语言学习笔记 — 进阶 — 接口(2.1):实现接口的条件 —— 接口的方法与实现接口的类型方法一致

go语言学习笔记 — 进阶 — 接口(2.3):接口无法实现的例子