广告
返回顶部
首页 > 资讯 > 后端开发 > GO >从零开始学Golang的接口
  • 636
分享到

从零开始学Golang的接口

2024-04-02 19:04:59 636人浏览 八月长安
摘要

目录前言1.为什么需要接口?2.接口是什么?如何定义?3.接口实战初体验4.如何测试是否已实现该接口?5.空接口&类型断言6.接口零值7.一个类型实现多个接口8.指针与值类型

前言

接口在面向对象编程中是经常使用的招式,也是体现多态很重要的手段。
是的。golang中也有接口这玩意儿。

1.为什么需要接口?

多数情况下,数据可能包含不同的类型,却会有一个或者多个共同点,这些共同点就是抽象的基础。前文讲到的Golang继承解决的是is-a的问题,单一继承的关系。但是当不同的父类具有相同的行为的时候,单一继承就没法解决了。

于是乎,接口出现了。接口可以理解为某一个方面的抽象,可以是多对一的(多个类型实现一个接口),这也是多态的体现。解决了上文一对一的问题。

2.接口是什么?如何定义?

是什么
接口是一组仅包含方法名、参数、返回值的未具体实现的方法的集合

如果实现了接口的所有方法,则认为实现了该接口,无需在该类型上显示的添加声明。

这个解释下,加深印象,在PHP中接口是长这样的:

//定义接口
interface base{
   public function getName();
}
 
//学生类
class student implements base{
   public function getName(){
      echo "咖啡色的羊驼";
   }
}

这里有个关键字:implements。

这样的声明称之为显示的,而在Golang中接口是隐式地实现。(埋个伏笔看下文)

定义

type interfaceName interface { 
    // 方法列表 
    GetName() string
} 

3.接口实战初体验

实际编程中呢,接口的命名大伙儿喜欢使用er结尾。当然这个看个人喜好。

上代码:

    package main

    import (
        "fmt"
    )
    
    // 定义一个接口
    type People interface {
        ReturnName() string
    }
    
    // 定义一个结构体
    type Student struct {
        Name string
    }
    
    // 定义结构体的一个方法。
    // 突然发现这个方法同接口People的所有方法(就一个),此时可直接认为结构体Student实现了接口People
    func (s Student) ReturnName() string {
        return s.Name
    }
    
    func main() {
        cbs := Student{Name:"咖啡色的羊驼"}
    
        var a People
        // 因为Students实现了接口所以直接赋值没问题
        // 如果没实现会报错:cannot use cbs (type Student) as type People in assignment:Student does not implement People (missing ReturnName method)
        a = cbs       
        name := a.ReturnName() 
        fmt.Println(name) // 输出"咖啡色的羊驼"
    }

4.如何测试是否已实现该接口?

使用接口特有的断言判断来实现(下文还会再次提到,加深印象)。

语法:x.(T)
这样的语法只适应于x是interface类型

接着上文例子,继续上代码:

    // 由于x.(T)只能是接口类型判断,所以传参时候,传入的是接口类型
    // 为何test的类型可以是一个空接口?埋伏笔下文便知。
    func CheckPeople(test interface{}) {
        if _, ok := test.(People); ok {
            fmt.Printf("Student implements People")
        }
    }

    
    func main() {
        cbs := Student{Name:"咖啡色的羊驼"}
        CheckPeople(cbs) // Student implements People
    }

5.空接口&类型断言

空接口

空接口就是不包含任何方法的接口。正因为如此,所有的类型都实现了空接口。

虽然空接口起不到任何作用,但是空接口在需要存储任何类型数值的时候非常有用,这也回答了上文的问题,因为空接口可以存储任意类型的数据。

    // 定义cbs为空接口
    var cbs interface{}
    var i int = 5
    var s string = "Hello world"
    // cbs可以存储任意类型的数值
    cbs = i
    cbs = s

类型断言

既然空接口可以存储任意类型,那么如何区分不同的类型?
常用的有两种方法:Comma-ok断言、switch判断。

上代码:

    package main
    
    import (
        "fmt"
    )
    
    // 定义一个结构体
    type Student struct {
        Name string
    }
    
    // 类型断言
    func main() {
        Params := make([]interface{}, 3)
        Params[0] = 88                   // 整型
        Params[1] = "咖啡色的羊驼"         // 字符串
        Params[2] = Student{Name: "cbs"} // 自定义结构体类型
        
        // Comma-ok断言
        for index, v := range Params {
            if _, ok := v.(int); ok {
                fmt.Printf("Params[%d] 是int类型 \n", index)
            } else if _, ok := v.(string); ok {
                fmt.Printf("Params[%d] 是字符串类型\n", index)
            } else if _, ok := v.(Student); ok {
                fmt.Printf("Params[%d] 是自定义结构体类型\n", index)
            } else {
                fmt.Printf("list[%d] 未知类型\n", index)
            }
        }
        
        // switch判断
        for index, v := range Params {
            switch  value := v.(type) {
            case int:
                fmt.Printf("Params[%d] 是int类型, 值:%d \n", index,value)
            case string:
                fmt.Printf("Params[%d] 是字符串类型, 值:%s\n", index,value)
            case Student:
                fmt.Printf("Params[%d] 是Person类型, 值:%s\n", index,value)
            default:
                fmt.Printf("list[%d] 未知类型\n", index)
            } 
        
        }  
    }

6.接口零值

接口的零值是nil

    package main
    
    import (
        "fmt"
    )
    
    type People interface {  
        GetName() string
    }
    
    // 输出 "cbs is nil 类型"
    func main() {  
        var cbs People
        if cbs == nil {
            fmt.Println("cbs is nil 类型")  
        }
    }

7.一个类型实现多个接口

    package main
    
    import (
        "fmt"
    )
    
    type People interface {
        ReturnName() string
    }
    
    type Role interface {
        ReturnRole() string
    }
    
    type Student struct {
        Name string
    }
    
    func (s Student) ReturnName() string {
        return s.Name
    }
    
    func (s Student) ReturnRole() string {
        return "学生"
    }
    
    func main() {
        cbs := Student{Name: "咖啡色的羊驼"}
    
        var a People  // 定义a为People接口类型
        var b Role    // 定义b为Role接口类型
        
        a = cbs // 由于Student实现了People所有方法,所以接口实现成功,可直接赋值
        b = cbs // 由于Student实现了Role所有方法,所以接口实现成功,可直接赋值
        
        name := a.ReturnName()
        fmt.Println(name) // 输出"咖啡色的羊驼"
    
        role := b.ReturnRole()
        fmt.Println(role) // 输出"学生"
    }

也说明一个东西:实现了某个接口的类型,还可以有其它的方法。只要是方法实现包含接口的即可。

8.指针与值类型实现接口的区别

    package main
    
    import (
        "fmt"
    )
    
    type People interface {
        ReturnName() string
    }
    
    type Student struct {
        Name string
    }
    
    type Teacher struct {
        Name string
    }
    
    func (s Student) ReturnName() string {
        return s.Name
    }
    
    func (t *Teacher) ReturnName() string {
        return t.Name
    }
    
    func main() {
        cbs := Student{Name: "咖啡色的羊驼"}
        sss := Teacher{Name: "咖啡色的羊驼的老师"}
    
        // 值类型
        var a People
        a = cbs 
        name := a.ReturnName()
        fmt.Println(name)
    
        // 指针类型
        // a = sss <- 这样写不行!!!
        a = &sss // 由于是指针类型,所以赋值的时候需要加上&
        name = a.ReturnName()
        fmt.Println(name) // 输出"咖啡色的羊驼的老师"
    }

"a = sss"这样写会发生报错:

    cannot use sss (type Teacher) as type People in assignment:
    Teacher does not implement People (ReturnName method has pointer receiver)

因为是Teacher的指针实现了ReturnName方法,Teacher本身没实现。

9.接口嵌套

类似于php的接口继承,Golang也有它的接口嵌套。

    package main
    
    import (
        "fmt"
    )
    
    type People interface {
        ReturnName() string
    }
    
    type Role interface {
        People // 接口嵌套
        ReturnRole() string
    }
    
    type Student struct {
        Name string
    }
    
    func (s Student) ReturnName() string {
        return s.Name
    }
    
    func (s Student) ReturnRole() string {
        return "学生"
    }
    
    func main() {
        cbs := Student{Name: "咖啡色的羊驼"}
        
        var a Role
        a = cbs 
        name := a.ReturnName()
        fmt.Println(name)
    
        role := a.ReturnRole()
        fmt.Println(role) 
    }

到此这篇关于从零开始学Golang的接口的文章就介绍到这了,更多相关Golang 接口内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 从零开始学Golang的接口

本文链接: https://www.lsjlt.com/news/143734.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 从零开始学Golang的接口
    目录前言1.为什么需要接口?2.接口是什么?如何定义?3.接口实战初体验4.如何测试是否已实现该接口?5.空接口&类型断言6.接口零值7.一个类型实现多个接口8.指针与值类型...
    99+
    2022-11-13
  • 从零开始学习go接口和bash
    从零开始学习Go接口和Bash Go语言是近年来备受关注的一门高性能编程语言,而Bash则是Linux系统下广泛使用的一种脚本语言。在本篇文章中,我们将会从零开始学习Go接口和Bash,深入了解它们的特性和用法,并结合实例演示代码。 一、G...
    99+
    2023-09-29
    接口 bash 学习笔记
  • 从零开始学Python-day3
    Python--Day3学习要有定位,明确目标地去学习。---leavespython02---list知识一 list的概念    列表的概念:列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(所谓嵌套)。...
    99+
    2023-01-31
    从零开始 Python
  • 从零开始学Python-day7
    python-Day7学习要有定位,明确目标地去学习。希望自己能坚持下去,并有所收获---leaves(ps月初有事耽误计划了,进度落后计划蛮多了,算了。不多想,复习,学会才是硬道理,坚持fighting!...
    99+
    2022-10-18
  • 从零开始学习React
    这篇文章主要讲解了“从零开始学习React”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“从零开始学习React”吧!0: 从一次最简单的 React 渲染说...
    99+
    2022-10-19
  • 从零开始学习Node.js
    目录url模块1.parse 方法2.format 方法3.resolve 方法events模块(事件驱动)path模块总结url模块 1.parse 方法 // test02....
    99+
    2022-11-12
  • 从零开始学Python-day2
    Python--Day2今日一句:距2017年仅剩三月不足,整理思路。希望来年按计划一步一步走下去!学习要有定位,明确目标地去学习。---leavespython01---基础语法运维开发:    这个岗位最近已经越来越火,作为一个刚毕业没...
    99+
    2023-01-31
    从零开始 Python
  • 从零开始的Python学习Episode
    一、输入与输出 1.输入 input("number:") num = input("number:") 下面一段可以把输入的信息存在num中。 注意:输入的信息会被认为是字符串,如果要输入数字进行运算要先把输入的信息进行强制类型转换...
    99+
    2023-01-30
    从零开始 Python Episode
  • 如何从零开始学Java
    很多人在大学就开始考虑学一技之长,以便于将来在职业上有更多的选择。 有的人则是在社会上碰壁撞了南墙之后,毅然决然要学一门技术来安身立命。或许是同学朋友的介绍,或许是看多了广告,或许仅仅是缘分,你选择了Java。我不是推荐你要学Java,我是...
    99+
    2023-09-21
    java 计算机视觉 计算机网络 java
  • 从零开始学习PHP编程算法打包,从此接口开发如虎添翼!
    PHP编程算法打包是一种非常重要的技能,可以帮助接口开发者更加高效地开发出优质的接口。本文将从零开始介绍PHP编程算法打包的相关知识,帮助读者快速掌握这项技能。 一、了解算法打包的概念 算法打包是指将常用的算法封装成函数,以便在后续的编程中...
    99+
    2023-06-26
    编程算法 打包 接口
  • 从零开始学Python的方法教程
    本篇内容主要讲解“从零开始学Python的方法教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“从零开始学Python的方法教程”吧!课题今天的课题是用Python实现一个猜数字游戏,所谓的猜数...
    99+
    2023-06-15
  • 从零开始学习 Java 接口框架打包,这里有完整指南!
    Java 接口框架打包是 Java 开发中非常重要的一部分。它允许我们将所有的 Java 类打包到一个 jar 文件中,以便我们可以轻松地将我们的代码分发给其他人。在本文中,我们将学习如何从零开始学习 Java 接口框架打包,并提供一个完...
    99+
    2023-08-31
    打包 接口 框架
  • 从零开始学习ASP教程中的接口和Shell,实现网站的快速开发!
    ASP是一种面向Web应用程序开发的脚本语言,是一种强大的工具,可用于快速开发高效的Web应用程序。其中,接口和Shell是ASP中非常重要的两个概念,本文将详细介绍这两个概念的作用和使用方法,以便读者可以更好地了解ASP的使用。 一、接...
    99+
    2023-11-03
    教程 接口 shell
  • 如何从零开始学习Go Spring Shell?
    Go Spring Shell 是一个基于 Go 语言和 Spring 框架的命令行工具,它可以帮助开发者更方便地管理和维护应用程序。如果你想从零开始学习 Go Spring Shell,本文将为你提供一些有用的指导。 第一步:安装 Go ...
    99+
    2023-10-14
    spring shell 教程
  • 从零开始学android小示例程序
    布局文件 代码如下:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andr...
    99+
    2022-06-06
    程序 示例 Android
  • 怎么从零开始学习Java语言
    这篇文章将为大家详细讲解有关怎么从零开始学习Java语言,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、如何从零开始学习Java语言许多朋友在学习新的语言上有些困惑,如何学好Java语言。如何学好Jav...
    99+
    2023-06-17
  • 从零开始学习PYTHON3讲义(十六)(
    《从零开始PYTHON3》学习资源包下载 课程连载已经完全结束。 经过整理校对,这里把在课程中出现过的源码和练习答案示例源码全部打包提供下载: https://pan.baidu.com/s/1Ljzu_uKrgygUZ5eRe1ldf...
    99+
    2023-01-30
    讲义 从零开始 十六
  • 从零开始学Java之关系运算符
    目录引言定义实例注意点举例总结引言 ♀ 小AD:明哥,我怎么就那么讨厌刺客,凭什么我就打不过他们,每次把我秒了。 ♂ 明世隐:这是因为英雄克制,刺客就是用来对方脆皮的。 ♀ 小AD...
    99+
    2022-11-12
  • 从零开始学习PYTHON3讲义(四)让程
    《从零开始PYTHON3》第四讲 先看看上一讲的练习答案。 程序完成的是功能,功能来自于“程序需求”(“需求”这个词忘记了什么意思的去复习一下第二讲)。 练习的程序需求当然就是练习题本身。所以编程类的练习题通常并没有所谓标准答案,只要...
    99+
    2023-01-30
    讲义 从零开始
  • 从零开始学习PYTHON3讲义(七)条件
    《从零开始PYTHON3》第七讲 人生是由无数个选择组成,每个选择都有不同的限定条件。现在来说人生有点早是吧:)不过事实的确是这样的。 程序也充满着选择,满足不同的条件,则运行不同的运算。这些对不同运算的选择,则被称为分支,或者叫“条...
    99+
    2023-01-30
    讲义 从零开始 条件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作