文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go语言中的接口怎么使用

2023-07-04 17:58

关注

今天小编给大家分享一下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}

type

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

接口名

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

interface

接口的标识。

接口体

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

接口的实现

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")    }}

以上就是“Go语言中的接口怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯