非零基础自学Golang 第12章 接口与类型 12.6 小结 12.7 知识拓展

news2025/4/19 9:25:14

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第12章 接口与类型
        • 12.6 小结
        • 12.7 知识拓展
          • 12.7.1 非侵入式接口

第12章 接口与类型

12.6 小结

  • 了解什么是鸭子类型。
  • 掌握接口的定义与实现。
  • 了解什么是接口嵌入。
  • 掌握空接口的常见用法,如空接口的赋值操作。
  • 掌握类型断言的两种方式:ok-pattern和switch-type。
  • Go语言的接口是非常易用、简洁的,需要重点掌握的是Go语言的接口实现和类型断言,能够判断接口值是什么类型,接口值的内容是什么。

12.7 知识拓展

12.7.1 非侵入式接口

Go语言的接口是非侵入式的,我们先来看侵入式接口与非侵入式接口的区别:

  • 侵入式接口:需要显式地创建一个类去实现一个接口。
  • 非侵入式接口:不需要显式地创建一个类去实现一个接口。

大部分语言的接口都是侵入式接口,需要显式地去创建声明实现一个接口。

例如Java的接口定义如下,要实现一个接口,必须使用implements显式声明。

[动手写 12.7.1]

package Java20221205;

/**
 * ClassName: IFoo
 * date: 2022/12/5 15:48
 *
 * @author DingJiaxiong
 */
public interface IFoo {

    void Bar();
}
package Java20221205;

/**
 * ClassName: Foo
 * date: 2022/12/5 15:48
 *
 * @author DingJiaxiong
 */
class Foo implements IFoo {
    @Override
    public void Bar() {

    }
}

在这里插入图片描述

非侵入式接口有三个好处:

  • 去掉了繁杂的继承体系,Go语言的标准库再也不需要绘制类库的继承树图。在Go中,类的继承树并无意义,你只需要知道这个类实现了哪些方法、每个方法是何含义就足够了。
  • 实现类的时候,只需要关心自己应该提供哪些方法,不用再纠结接口需要拆得多细才合理。接口由使用方按需定义,而不用事前规划。
  • 不用为了实现一个接口而导入一个包,因为多引用一个外部的包,就意味着更多的耦合。
    接口由使用方按自身需求来定义,使用方无须关心是否有其他模块定义过类似的接口。

总的来说,非入侵式的接口设计更简洁、灵活,更注重实用性。

下面我们从代码层面来更深入地理解。

[ 动手写12.7.2 ]

package main

type IPhoner interface {
   Call() error
   Video() error
   Game() error
}

type Apple interface {
   Call() error
   Video() error
}

type Huawei interface {
   Call() error
   Game() error
}

在这里插入图片描述

动手写12.7.2创建了三个接口,分别是IPhoner、Apple、Huawei,其中Apple、Huawei接口的方法在IPhoner接口中全部包含。

我们再来创建一个实现IPhoner接口的结构体:

[ 动手写12.7.3]

package main

import "fmt"

type IPhoner interface {
   Call() error
   Video() error
   Game() error
}

type Apple interface {
   Call() error
   Video() error
}

type Huawei interface {
   Call() error
   Game() error
}

type Phone struct {
   Name string
}

func (p *Phone) Call() error {
   fmt.Println(p.Name, "Start Call")
   return nil
}

func (p *Phone) Video() error {
   fmt.Println(p.Name, "Start Video")
   return nil
}

func (p *Phone) Game() error {
   fmt.Println(p.Name, "Start Game")
   return nil
}

在这里插入图片描述

动手写12.7.3创建了一个叫Phone的结构体,并有实现IPhoner的三个方法Call()、Video()、Game(),也就是说,Phone是IPhoner这个接口的一个实现。

这时,如果我们想要获得一个Apple的对象,在传统的侵入式接口语言里,至少要写一个appleClass类去实现Apple接口,而为了得到一个Huawei的对象又不得不写一个huaweiClass类去实现Huawei接口。同理,要得到一个IPhoner的对象也得这么做,但显然这样的操作,代码的复用率并不高。

而在Go语言中,并不需要这样,只需要写一个通用的IPhoner接口实现就可以完成以上需求,也就是只需要Phone这个实现就可以了。

[ 动手写 12.7.4 ]

package main

import "fmt"

type IPhoner interface {
   Call() error
   Video() error
   Game() error
}

type Apple interface {
   Call() error
   Video() error
}

type Huawei interface {
   Call() error
   Game() error
}

type Phone struct {
   Name string
}

func (p *Phone) Call() error {
   fmt.Println(p.Name, "Start Call")
   return nil
}

func (p *Phone) Video() error {
   fmt.Println(p.Name, "Start Video")
   return nil
}

func (p *Phone) Game() error {
   fmt.Println(p.Name, "Start Game")
   return nil
}

func main() {

   var apple Apple = &Phone{"apple"}
   var huawei Huawei = &Phone{"huawei"}

   apple.Call()
   huawei.Game()
}

运行结果

在这里插入图片描述

动手写12.7.4仅使用Phone这个接口实现就完成了Apple和Huawei这两个接口的实例。

动手写12.7.4也可以使用new来生成Apple的实例:

[ 动手写 12.7.5]

package main

import "fmt"

type IPhoner interface {
   Call() error
   Video() error
   Game() error
}

type Apple interface {
   Call() error
   Video() error
}

type Huawei interface {
   Call() error
   Game() error
}

type Phone struct {
   Name string
}

func (p *Phone) Call() error {
   fmt.Println(p.Name, "Start Call")
   return nil
}

func (p *Phone) Video() error {
   fmt.Println(p.Name, "Start Video")
   return nil
}

func (p *Phone) Game() error {
   fmt.Println(p.Name, "Start Game")
   return nil
}

func main() {

   var apple Apple = new(Phone)
   var huawei Huawei = new(Phone)

   apple.Call()
   huawei.Game()
}

运行结果

在这里插入图片描述

没毛病,懂了!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言知识学习归纳总结(逐梦篇专栏合集)

上一专栏: 项目实战合集 逐梦编程,让中华屹立世界之巅。 简单的事情重复做,重复的事情用心做,用心的事情坚持做; 文章目录前言一、逐梦篇目录合集二、不忘初心"Hello world"总结壁纸(与你同在)前言 不知不觉中&#x…

详解事务:Mysql事务、Spring事务、分布式事务

详解事务:Mysql事务、Spring事务、分布式事务(一)Mysql事务【1】4种隔离级别【2】测试案例(二)Spring事务【1】准备测试代码(1)添加依赖(2)配置文件(3&#x…

《classnames源码》阅读笔记

源码目录总览 参考官方文档中的内容,我们可以知道classnames 有一个主要版本(index)和两个替代版本 (分别是dedupe 和 bind)。在看目录的时候也可以发现 classnames 具有多个对外暴露的入口。 index.js是classnames的主…

Spring MVC【参数的获取与数据返回】

Spring MVC【参数的获取与上传】🍎一. 获取参数🍒1.1 获取单个参数🍒1.2 获取多个参数🍒1.3 获取多个参数🍒1.4 获取URL中参数 (PathVariable)🍎二. 上传文件 (RequestPart)🍒2.1 postman模拟上…

目标检测论文解读复现【NO.23】FS-YOLOv5:轻量化红外目标检测方法

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0…

33个CadQuery程序化建模实例

本文介绍的33个建模示例可以帮助你了解如何使用 CadQuery 构建3D对象。示例是从简单到复杂组织起来的,因此按顺序学习它们是吸收它们的最佳方式。 1、简易矩形板 最简单的例子,一个矩形盒子: result cadquery.Workplane("front&qu…

食品加工企业自营商城小程序开发,帮助企业增加销售渠道,提高销量

随着生活水平的不断提高,人们对于食品质量提出了更高的要求。传统人们购买食品时只能到超市或者市场进行食品采购,需要花费一定的时间和精力,而且经过多层中间商赚取差价的原因性价比也并不高。在移动电商的时代发展下,很多企业商…

『 canvas 动画』为了让老婆彻底理解正弦和余弦,我连夜制作了这个效果

前言 最近在做 canvas 相关的效果时,经常用到三角函数以及正/余弦相关的数字知识,这些知识点都是我们在初中的时候就学过的,但是这么多年基本已经忘的差不多了,刚好最近又学到了一个用 canvas 来实现的正/余弦动画效果&#xff0…

成功转行Python工程师,年薪30W+,经验总结都在这

这是给转行做Python的小白的参考,无论是从零开始,或者是转行的朋友来说,这都是值得一看的,也是可以作为一种借鉴吧。 而且我决定转行IT(互联网)行业,其实理由也很简单,不用动体力&a…

循环冗余编码(CRC编码)与海明码(考研前突击一下QAQ)

循环冗余编码(CRC编码)与海明码 一.环冗余编码 1.循环冗余编码的形成 生成多项式:G1011 表示成生成多项式为G(x)X3X1X^3X1X3X1 示例: 假设信息字节为:F1001010 选取生成多项式(默认)G1011 将…

2022年下半年部分团队的总结

这是 2021 年年底的汇报。 这是 2022 年上半年的汇报。 踏石留印 抓铁有痕 CSDN 是中国 IT 人士学习,成长,成功的平台。除了一些创新的探索之外, 20 多年来,CSDN 团队为这个平台开发和维护着各种基本功能和服务,还进…

自动化测试技术笔记(一):前期调研怎么做

昨天下午在家整理书架,把很多看完的书清理打包好,预约了公益捐赠机构上门回收。 整理的过程中无意翻出了几年前的工作记事本,里面记录了很多我刚开始做自动化和性能测试时的笔记。虽然站在现在的角度来看,那个时候无论是技术细节…

“ 这片绿茵从不缺乏天才,努力才是最终的入场券——梅西 ”

前言 想了又想还是忍不住想发布一篇文章来纪念一下2022年的卡塔尔世界杯,这伟大的诸神黄昏之战。4年一届的世界杯像是一把衡量时间的坐标,正所谓青春不过几届世界杯!2014巴西世界杯在上初一,2018俄罗斯世界杯在上高二,…

如何成为一名合格的互联网大厂Python工程师?

Python开发工程师,是一个在IT行业圈子里一直都很热门的话题,无论是像腾讯、百度这样的大型公司,还是刚刚起步的初创公司,都会招python开发工程师。 python已成为越来越多开发者的开发语言选择, 而python开发工程师工资…

[附源码]计算机毕业设计Python架构的博客平台设计(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

【Python计算几何】德劳内三角剖分算法 | scatter 绘制散点图 | Dealunay 函数

猛戳!跟哥们一起玩蛇啊 👉 《一起玩蛇》🐍 💭 写在前面: 本章我们将介绍的是计算机和领域的 Delaunay 三角剖分算法(即德劳内三角剖分),它是一种用于将点集划分成三角形网格的算法。…

如何同时启动Android平台GB28181设备接入模块和轻量级RTSP服务模块?

技术背景 在介绍GB28181设备接入模块和轻量级RTSP服务之前,我们需要先搞清楚,二者的使用场景和技术设计的差别: 首先是GB28181设备接入模块: 为什么要设计GB28181设备接入模块?GB28181接入SDK,实现不具备…

软件:分享六款实用的软件,每一款值得收藏

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

[XCTF]funny_video(难度2)

目录 一、题目重述 二、解题思路 1.分解音视频 2.处理音频 总结 前言 视频夹杂着一段音频,怎么提取?遇到一款新的工具!MKVToolNix 特此记录! 一、题目重述 一段视频,观看之后发现有一段还夹杂着音频。 XCTF-fu…

避坑指南!Python里面的这九个坑,坑的就是你

Python里面有一些坑,让你防不胜防,菜鸟经常会弄晕,而学习多年的Python老鸟也会时不时中招。小编整理了9个坑,都是会经常碰到的坑,让你大呼我曾经也碰到过! 虽然是小的问题,但是在实际的项目中,哪…