非零基础自学Golang 第12章 接口与类型 12.1 接口定义

news2024/11/17 12:32:13

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第12章 接口与类型
        • 12.1 接口定义
          • 12.1.1 接口的定义
          • 12.1.2 鸭子类型

第12章 接口与类型

在使用接口时,我们经常会遇到这样一个问题:如何判断一个接口的类型?这时,我们就需要学习使用Go语言的类型断言来解决问题了。

接口的使用是为了抽象,方便代码的解耦。以下内容是Go语言学习的重点,也是一个难点,掌握好了就能写出更加优质、简洁、可复用的代码。【冲啊!!】

12.1 接口定义

12.1.1 接口的定义

在Go语言中,接口(interface)是一个自定义类型。

接口类型是一种抽象的类型,它不会暴露出它所代表的内部属性的结构,而只会展示出它自己的方法,因此,不能将接口类型实例化。

根据Go语言规范,单个函数的接口命名为函数名加上“er”作为后缀,例如Reader、Writer、Formatter等。

接口命名规范如下:

  • 单个函数的接口名以“er”作为后缀,接口的实现则去掉“er”。
  • 两个函数的接口名综合两个函数名,以“er”作为后缀,接口的实现则去掉“er”。
  • 三个以上函数的接口,抽象这个接口的功能,类似于结构体命名。

Go语言的接口是非常灵活的,它通过一种方式来声明对象的行为,谁实现了这些行为,就相当于实现了这个接口里面声明各种方法的集合,但接口本身不去实现这些方法所需要的一些操作,因为这些方法没有被实现,所以它们是抽象的方法。

这就非常像其他语言中实现面向对象的抽象方法,只不过其他语言中需要先继承再实现相对应的方法,而Go不需要继承,只要在结构中声明和实现了这些方法,也就相当于实现了这个抽象方法接口声明格式。

和定义结构体相似,定义一个接口还是使用type,这说明了接口也是一种类型,下面举一个接口的例子。

[ 动手写 12.1.1]

package main

type Animal interface {
   Name() string
   Speak() string
}

type Cat struct {
}

func (cat Cat) Name() string {
   return "Cat"
}

func (cat Cat) Speak() string {
   return "喵喵喵"
}

在这里插入图片描述

动手写12.1.1定义了一个叫Animal的接口,结构体Cat实现了Animal接口的两个方法,因此我们就可以认为,Cat实现了Animal接口。【嗦嘎,可以的】

【提示】

需要注意的是,与其他语言不同,Go语言的接口没有数据字段,只有定义的方法。

12.1.2 鸭子类型

在程序设计中,鸭子类型(duck typing)是动态类型的一种风格。

在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口来决定,而是由当前方法和属性的集合决定。

这个概念的名字来源于詹姆斯·惠特科姆·莱利(James Whitcomb Riley)提出的鸭子测试。

“鸭子测试”可以这样表述:当看到一只鸟走起来像鸭子,游泳起来像鸭子,叫起来也像鸭子,那么这只鸟就可以被称为鸭子。

Go语言通过接口实现了鸭子类型,对于Go来说,我们不关心对象是什么类型,或者到底是不是鸭子,我们只关心行为,关心它是如何使用的。

【提示】

一般来说,静态类型语言在编译时便已确定了变量的类型,但是Go语言的实现是在编译时推断变量的类型。【牛逼牛逼】

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

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

相关文章

Dubbo 4 Dubbo 高级特性 4.1 dubbo-admin 管理平台 4.1.3 dubbo-admin的简单使用

Dubbo 【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】 4 Dubbo 高级特性 文章目录Dubbo4 Dubbo 高级特性4.1 dubbo-admin 管理平台4.1.3 dubbo-admin的简单使用4.1 dubbo-admin 管理平台 4.1.3 dubbo-admin的简单使用 注意:Dubbo Admin【服务Mock】【服务…

几个字就能生成画作,AIGC的时代即将到来

一、前言 最近AI绘画、聊天、代码生成可以说是刮起了一阵风,席卷了互联网。各大网站都在疯狂刷屏相关的内容,也收到了各界的热烈的关注。无论是AI绘画还是聊天这类的技术都属于同一个领域:人工智能生成内容(AIGC) 小伙…

SAP UI5 Mock Server 在响应 OData 请求时的单步调试

SAPUI5 中包含的模拟服务器模仿 OData V2 后端调用。 它模拟 OData 提供程序并且完全基于客户端,这意味着不需要与远程主机的网络连接。 它拦截对服务器的 HTTP 调用,并向客户端提供伪造的输出。 所有这些对于数据绑定和 OData 模型的使用都是透明的&…

【Python百日进阶-数据分析】Day131 - plotly柱状图(条形图):go.bar()实例2

文章目录4.2.14 多类别轴型条形图4.2.15 基本水平条形图4.2.16 彩色水平条形图4.2.17 条形图的调色板4.2.18 带直线图的条形图4.3 Dash中的条形图4.2.14 多类别轴型条形图 如果记录道具有x或y阵列,则轴类型将自动推断为多类别。 import plotly.graph_objects as g…

Dubbo 4 Dubbo 高级特性 4.2 Dubbo 常用高级配置 4.2.2 地址缓存 4.2.3 超时

Dubbo 【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】 4 Dubbo 高级特性 文章目录Dubbo4 Dubbo 高级特性4.2 Dubbo 常用高级配置4.2.2 地址缓存4.2.3 超时4.2 Dubbo 常用高级配置 4.2.2 地址缓存 【一个问题】 如果 注册中心挂了,服务是否可以…

计算机毕业设计ssm+vue基本微信小程序的垃圾分类系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,垃圾分类小程序就是信息时代变革中的产物之一。 任何系统都要遵循系统…

uni-app卖座电影多端开发纪实(四):用户交互

@Tabs切换 + 分页加载 Tabs切换效果图 正在加载效果图 没有更多效果图 @uView组件使用 uView/Tabs的使用 uView/Tabs文档 先搂一眼! uView/loadMore的使用 uView/loadMore文档先搂一眼! @准备工作 电影条目组件封装 components/FilmItem.vue

2022/12/17 mysql 索引基本原理解读

1什么是索引 索引是帮助MySQL 高效获取数据的数据结构,通过使用索引可以在查询的过程中,使用优化隐藏器,提高系统的性能。 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 优势 类似于书籍的目录索引,提高数…

java缓存模块,ehcache/guava cache/自定义spring的CacheManager/自定义缓存

如ehcache,guava cache,redis 也有将ehcache,guava cache分级为单机缓存 将redis分为分布式缓存 ehcache官网:https://www.ehcache.org/ 这里主要说下ehcache和guava cache 单独使用ehcache(当然真正企业开发并不会单独使用ehcache,而是会和Spring或者SpringBoot集成使用) …

什么是建筑中的“光储直柔”

建筑“光储直柔”与零碳电力如影随形(2021) 《2030 年前碳达峰行动方案》(国发〔2021〕23 号)中明确提出:提高建筑终端电气化水平,建设集光伏发电、储能、直流配电、柔性用电于一体的“光储直柔”建筑。到 …

广告、推荐模型加速策略整理

当我们尝试那些开箱即用的GPU服务时,很快意识到在经济高效地利用GPU运行推荐模型服务之前需要对其优化。我们首先使用分析工具来分析在模型推理过程中发生了什么,在仔细观察分析结果时,我们注意到时间线上有大量的小CUDA Kernel在执行。 这是…

[附源码]Python计算机毕业设计Django汽配管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

linux内核内存管理-brk系统调用

【推荐阅读】 深入linux内核架构--进程&线程 浅谈linux 内核网络 sk_buff 之克隆与复制 浅析linux内核网络协议栈--linux bridge 尽管可见度不高,brk也许是最常使用的系统调用了,用户进程通过它向内核申请空间。人们常常并不意识到在调用brk&…

Python Flask构建微信小程序订餐系统 (三)

🔥 管理员登录和列表界面 🔥 账号相关登录界面 1、新建 User 对象文件 2、新建login (登录的方法)、edit (编辑的方法)、reset-pwd(重置密码的方法)方法 3、新建对应的视图层 账户管理相关界面 1、新建 Account 对象文件 2、新建index(账户列表)、set(新…

基于 Spring Cloud 的微服务脚手架

基于 Spring Cloud 的微服务脚手架 作者: Grey 原文地址: 博客园:基于 Spring Cloud 的微服务脚手架 CSDN:基于 Spring Cloud 的微服务脚手架 本文主要介绍了基于 Spring Cloud Finchley 和 Spring Boot 2.0.x 版本的微服务脚…

2006-2019年280个地级市绿色全要素生产率含原始数据和测算结果

2006-2019年280个地级市绿色全要素生产率含原始数据和测算结果 1、时间:2006-2019年 2、来源:原始数据来自各省NJ 城市NJ、各市NJ、各市社会统计GB 3、范围:包括280个地级市 4、指标包括: 投入:地级市市辖区从业人…

Spring Boot热部署配置

⭐️前言⭐️ 在我们进行Spring Boot项目的编写过程中,会有局部的代码,发生一些变动,这时候,我们只有将项目重启,发生变动的代码才能够生效,为了解决这个问题,我们可以设置Spring Boot热部署&a…

ClassLoader 隔离性的基石是namespace,证明给你看

一、背景 朋友:在我知识体系中ClassLoader的双亲委派机制是流畅丝滑的,可是看到通过委派执行类加载来保障这种分治能力,进而达到了类资源的隔离性突然就感觉有点陌生和排斥呢? 我:类的命名空间有了解嘛? …

Tableau可视化设计案例-01Tableau简介,条形图与直方图

文章目录Tableau可视化设计案例Tableau简介,条形图与直方图Tableau界面介绍Tableau绘制条形图2.1条形图1 各地区酒店数量2.2条形图2:各地区酒店均价2.3堆积图:价格等级堆积图Tableau绘制直方图3.1直方图概念与用途3.2创建评分直方图Tableau饼…

python中的split函数

返回数据类型为list # split以空格切片,返回数据类型为list a"I LOVE Python" print(a.split(" ")) print(type(a.split(" ")))运行结果如下: 可指定分隔符 # split以.切片,返回数据类型为list b"www.baidu.com" print…