我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文带你了解Go语言中接口的使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文带你了解Go语言中接口的使用

接口

Go 语言中,接口是一种抽象的类型,是一组方法的集合。接口存在的目的是定义规范,而规范的细节由其他对象去实现。我们来看一个例子:

import "fmt"

type Person struct {
    Name string
}

func main() {
    person := Person{Name: "cmy"}
    fmt.Println(person) // {cmy}
}

上述代码定义了结构体 Personmain 函数创建了此结构体的变量 person,然后通过 fmt 包里的 Println 函数打印这个结构体,打印结果为 {cmy}。在此基础上,我们改造一下代码:

import "fmt"

type Person struct {
    Name string
}

func (p Person) String() string {
    return fmt.Sprintf("name: %s", p.Name)
}

func main() {
    person := Person{Name: "cmy"}
    fmt.Println(person) // name: cmy
}

新改造的代码里为结构体 Person 添加一个结构体方法 String() string,方法的返回结果是对 name 进行格式化,我们再打印一下结构体,观察结果发现是 String() 方法返回的值,而不是 {cmy}。 为什么是这样呢?这是因为 fmt.Println(T) 函数的实现细节里,会对结构体进行判断,如果结构体实现了 Stringer 接口,则会直接打印 String() 方法的返回值。以下是 Stringer 接口的代码:

type Stringer interface {
    String() string
}

结构体实现了这个接口,也就意味着遵守这个接口所定义的规范,fmt.Println(T) 函数发现结构体有这个规范,因此就会根据规范来打印信息。基于 Stringer 接口,我们来看看接口的语法格式:

type XXX interface {
    // methods
}

1、type

接口的声明,必须以 type 关键字开头。

2、接口名

推荐驼峰式命名法,首字母大写的方法名可以在包外访问,小写的只能在包内访问。

3、interface

接口的标识。

4、接口体

大括号里面声明规范,也就是声明方法,方法必须具有名字。

接口的实现

Go 语言里,接口的实现不是基于接口,而是基于方法。如果一个自定义类型拥有了某个接口的所有方法,那么这个自定义类型就实现这个接口。接口的实现在上述的例子中有所体现,Person 结构体定义了 String() string 方法,拥有了 Stringer 接口的所有方法,因此实现了 Stringer 接口。

一个自定义类型可以实现多个接口

type A interface {
        a()
}

type B interface {
        b()
}
type Person struct {
        Name string
}

func (p Person) a() {
}

func (p Person) b() {
}

A 接口声明了 a 方法, B 接口声明了 b 方法,Person 结构体定义了 ab 两个方法,因此 Person 结构体实现了 AB 两个接口。

接口类型变量

一旦接口被定义,它就可以用于声明变量。

import "fmt"

type A interface {
}

func main() {
    var a A
    fmt.Println(a) // <nil>
}

如果只声明接口变量,不初始化,变量的值默认为 nil,因为接口类型实际上是一个指针。若为接口赋初值,需要选择一个合法的值,即被赋值的基类必须实现这个接口。

空接口

Go 语言里面可以认为所有类型实现了空接口,因为空接口没有任何的方法。

import "fmt"

type EmptyInterface interface {
}

func main() {
    var a EmptyInterface = 1
    var b EmptyInterface = true
    var c EmptyInterface = "hello"
    var d EmptyInterface = 3.14
    var e EmptyInterface = 'c'
    fmt.Println(a, b, c, d, e) // 1 true hello 3.14 99
}

所有类型都实现空接口,因此空接口变量可以被赋初值为任意类型的值或变量。

类型断言

Go 语言支持类型断言操作,通过这个操作,可以还原接口变量的右值(被赋的初值)。类型断言的语法形式通常为:

v, ok := a.(T)

如果断言成功,那么 v 的值为接口变量的值,ok 的值为 true;如果断言失败,v 的值为 T 类型的零值,ok 的值为 false

类型断言变种 type switch

通过 type switch 的方式,可以判断接口变量属于哪种动态类型。

import "fmt"

type EmptyInterface interface {
}

func main() {
    var a EmptyInterface = 1
    switch a.(type) {
    case string:
	fmt.Println("a 的右值类型为 string")
    case int:
	fmt.Println("a 的右值类型为 int")
    case bool:
	fmt.Println("a 的右值类型为 bool")
    case float64:
	fmt.Println("a 的右值类型为 float64")
    }
}

小结

本文先是对接口的定义进行介绍,然后通过一个例子,了解了接口其中的一个应用场景和引出接口的语法格式以及实现的方法,然后介绍了空接口的特点和类型断言,最后介绍了变种的类型断言 type switch 的应用例子。

到此这篇关于一文带你了解Go语言中接口的使用的文章就介绍到这了,更多相关Go语言接口内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文带你了解Go语言中接口的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文带你了解Go语言中接口的使用

这篇文章主要和大家分享一下Go语言中的接口的使用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的小伙伴可以参考一下
2022-12-08

一文带你了解Go语言中锁的实现

这篇文章主要带大家一起学习一下go锁和读写锁的总结文档, 主要从"参考"部分的文章结合源码学习,感兴趣的小伙伴可以跟随小编一起学习一下
2023-03-15

一文带你深入了解Go语言中的事务

事务中止时,你结束事务了吗?在开发时有可能就会犯这样的错误,其问题就是你在提交事务时,如果中间有其他业务就取消操作,那么事务也关闭了吗?本文就来详细讲讲
2023-05-16

十个示例带你深入了解Go语言中的接口

这篇文章主要是通过十个简单的示例带大家深入了解一下Go语言中接口的使用,文中的示例代码简洁易懂,具有一定的学习价值,需要的可以了解一下
2023-02-17

一文带你了解Go语言如何解析JSON

本文将说明如何利用 Go 语言将 JSON 解析为结构体和数组,如果解析 JSON 的嵌入对象,如何将 JSON 的自定义属性名称映射到结构体,如何解析非结构化的 JSON 字符串
2023-01-12

一文带你了解Go语言中time包的时间常用操作

在日常开发中,我们避免不了时间的使用,我们可能需要获取当前时间,然后格式化保存,也可能需要在时间类型与字符串类型之间相互转换等。本文将会对 Go time 包里面的常用函数和方法进行介绍,需要的可以参考一下
2022-12-08

一文带你了解Go语言fmt标准库输出函数的使用

这篇文章主要为大家详细介绍了Go语言中fmt标准库输出函数的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-31

一文带你深入理解Go语言中的sync.Cond

sync.Cond 表示的是条件变量,它是一种同步机制,用来协调多个 goroutine 之间的同步。本文将通过示例为大家介绍Go语言中sync.Cond的使用,需要的可以参考一下
2023-01-31

一文带你了解Go语言实现的并发神库conc

前几天逛github发现了一个有趣的并发库-conc,这篇文章将为大家详细介绍一下这个库的实现,文中的示例代码讲解详细,感兴趣的可以了解一下
2023-01-31

一文带你了解C++中queue的使用

C++中的queue是一种容器,用于在FIFO(先进先出)原则下存储和管理元素。本篇文章将深入探讨C++中的queue,包括它的定义、使用、原理和示例,感兴趣的可以了解一下
2023-05-18

一文带你了解C++中deque的使用

C++中的deque是一种双端队列,可以在队列的前端和后端进行插入元素和删除操作,同时可以视作一个长度不定的数组,支持高效的插入和删除操作。本篇文章将深入探讨C++中的deque的使用,感兴趣的可以了解一下
2023-05-18

一文带你了解Python中pymysql的使用

目录前言一、pymysql用途二、下载1.下载依赖2.下载方式三、使用 1.连接Mysql数据库2.创建游标对象 3.执行函数4.获取查询结果集的方法前言首先使用python很大一部分人是用于数据分析或者是开发,而数据来源一般都是存储在数
2023-02-21

一文带你了解Qt中槽的使用

这篇文章主要为大家详细介绍了Qt中槽的使用教程,文中的示例代码讲解详细,对我们学习Qt有一定的帮助,感兴趣的小伙伴可以跟随小编一起学习一下
2022-12-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录