学习golang(8) 初探:接口(1)

简介: 学习golang(8) 初探:接口(1)

什么是接口

接口在go中的关键字是interface,是一种抽象类型,(其他类型我们称之为显示类型/基础类型),你可以将它想象为一个盒子,可以装任何东西,如果你之前没有接触过其他语言类似于虚函数/多态,那么理解interface较为困难。



声明一个接口类型变量


如我们前面所述,interface也是我们的一个类型,只不过这个类型是一个抽象类型,没有关于它的基本操作,但是我们可以使用它来存放任何数据,我们来看下


声明一个interface

var data interface{}


interface可以存放任何数据,例如

data = 1
data = "pdudo juejin"
data = errors.New("dasdadsada")



类型转换


假设我们声明了且使用interface来存放数据,由于它只是一个抽象的类型,没有相关类型的基本操作,所以我们需要将其转换为它相应的类型,从而进行操作。


类型断言

想要进行类型转换,不管是隐式的还是显式的,我们都需要来确定该接口应该是哪种类型才行,不过在此之前,我们可以使用反射(reflect.TypeOf)来查看一下接口的类型。


例如:

我们有如下代码,我们可以来打印一下它的类型

image.png


我们执行下


image.png



可以看到,我们顺利拿到了类型,其第一次为int, 第二次为string

除此之外,我们还可以使用interface.(type)来进行类型断言,例如:

image.png


我们可以使用 _, ok := data.(int) 来进行变量转换,若判断成功,ok则为true,否则为false

我们运行下

image.png


除此之外,我们使用switch配合interface.(type)来判断类型,其实是用的最多的

例如

image.png


我们执行下

image.png

我们可以看到,相关类型都已经被打印出来了,请注意,我们不能直接使用interface.(type)去获取类型,只用通过switchinterface.(type)才能获取数据类型,进行case判断。



类型转换


我们上述已经看了如何去进行类型断言,判断interface是属于那种类型了,我们再来看下如何进行类型转换呢,类型转换和断言类型,我们只需要x = interface.(类型)就可以拿到相应的值了,例如:

前提是我们需要得到接口数据的类型才行

image.png



我们执行下,我们可以得到结果

image.png


接口的组成

接口组成,我们可以分为2部分: 动态类型动态值,他们大概像这样的

image.png


空接口

当我们声明了一个接口,什么也不做的时候,抽象出来大概是这样的

var data interface{}

image.png



因为为nil, 所以,我们可以用data == nil来判断是否为空接口,例如


image.png

我们执行下程序

image.png


可以看到,输出正如我们所预料的,是一个空接口



传入一个值

若我们这样来编写程序

var data interface{}
var ss int = 99
data = ss


此时interface抽象出来大概是这样的

image.png


请注意,go中永远是指传递,所以即使,我们修改了ss变量的值,也不会影响data,我们来看下

image.png

我们执行下

image.png



总结


以上内容便是接口(1) 的内容了,严格意义上来说,他们还不算接口,充其量类似于javaobject,不过我们也看到了interface的特性,还记得之前我们设计go编写一个链式hash么,我们定义的结构体大概是这样的,所以说我们才可以存储任何keyvalue


// 链表Node 实际的hash {key,value}
type Node struct {
  key interface{} // key
  value interface{} // value
  nextNode *Node // 指向下一个节点
}

以上就是接口变量的操作了。









相关文章
|
1月前
|
安全 Java Go
【Golang入门】简介与基本语法学习
Golang语言入门教程,介绍了Go语言的简介、基本语法、程序结构、变量和常量、控制结构、函数、并发编程、接口和类型、导入包、作用域以及错误处理等关键概念,为初学者提供了一个全面的学习起点。
24 0
|
2月前
|
Go
Golang语言基础之接口(interface)及类型断言
这篇文章是关于Go语言中接口(interface)及类型断言的详细教程,涵盖了接口的概念、定义、实现、使用注意事项以及类型断言的多种场景和方法。
38 4
|
3月前
|
机器学习/深度学习 存储 人工智能
Golang bytes 包学习
Golang bytes 包学习
25 3
|
4月前
|
编译器 Go C语言
通过例子学习在golang中调试程序
【7月更文挑战第4天】Go语言支持使用cgo进行汇编调试,官方文档在golang.org/doc/asm。注意,调试Go运行时可能遇到变量不可用或行号错误,需谨慎使用step命令。
74 1
通过例子学习在golang中调试程序
|
6月前
|
Go
golang学习参考记录
golang学习参考记录
|
6月前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
6月前
|
JSON Go 数据格式
golang学习6,glang的web的restful接口传参
golang学习6,glang的web的restful接口传参
|
6月前
|
JSON Go 数据格式
golang学习5,glang的web的restful接口
golang学习5,glang的web的restful接口
|
6月前
|
Go
golang学习4,glang的web接口
golang学习4,glang的web接口
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
115 4
Golang语言之管道channel快速入门篇