go语言学习笔记 — 进阶 — 接口(6):空接口类型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是不可比较类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值