如何理解 GO 语言的接口 - 鸭子模型

news2024/9/26 1:20:22

在这里插入图片描述

个人认为,要理解 Go 的接口,一定先了解下鸭子模型。

鸭子模型

那什么鸭子模型?

鸭子模型的解释,通常会用了一个非常有趣的例子,一个东西究竟是不是鸭子,取决于它的能力。游泳起来像鸭子、叫起来也像鸭子,那么就可以是鸭子。

动态语言,比如 Python 和 Javascript 天然支持这种特性,不过相对于静态语言,动态语言的类型缺乏了必要的类型检查。

Go 接口设计和鸭子模型有密切关系,但又和动态语言的鸭子模型有所区别,在编译时,即可实现必要的类型检查。

什么是 Go 接口

Go 接口是一组方法的集合,可以理解为抽象的类型。它提供了一种非侵入式的接口。任何类型,只要实现了该接口中方法集,那么就属于这个类型。

举个例子,假设定义一个鸭子的接口。如下:

type Duck interface {
	Quack()   // 鸭子叫
	DuckGo()  // 鸭子走
}

假设现在有一个鸡类型,结构如下:

type Chicken struct {
}

func (c Chicken) IsChicken() bool {
	fmt.Println("我是小鸡")
}

这只鸡和一般的小鸡不一样,它比较聪明,也可以做鸭子能做的事情。

func (c Chicken) Quack() {
	fmt.Println("嘎嘎")
}

func (c Chicken) DuckGo() {
	fmt.Println("大摇大摆的走")
}

注意,这里只是实现了 Duck 接口方法,并没有将鸡类型和鸭子接口显式绑定。这是一种非侵入式的设计。

我们定义一个函数,负责执行鸭子能做的事情。

func DoDuck(d Duck) {
	d.Quack()
	d.DuckGo()
}

因为小鸡实现了鸭子的所有方法,所以小鸡也是鸭。那么在 main 函数中就可以这么写了。

func main() {
	c := Chicken{}
	DoDuck(c)
}

执行正常。如此是不是很类似于其他语言的多态,其实这就是 Go 多态的实现方法。

空接口

继续说说空 interface。

如果一个 interface 中如果没有定义任何方法,即为空 interface,表示为 interface{}。如此一来,任何类型就都能满足它,这也是为什么当函数参数类型为 interface{} 时,可以给它传任意类型的参数。

示例代码,如下:

package main

import "fmt"

func main() {
	var i interface{} = 2
	fmt.Println(i)
}

更常用的场景,Go 的 interface{} 常常会被作为函数的参数传递,用以帮助我们实现其他语言中的泛型效果。Go 中暂时不支持 泛型,不过 Go 2 的方案中似乎将支持泛型。

总结

回答结束,做个简单总结。理解 Go 接口要记住一点,接口是一组方法的集合,这句话非常重要,理解了这句话,再去理解 Go 的其他知识,比如类型、多态、空接口、反射、类型检查与断言等就会容易很多。

我的博文:如何理解 Go 的接口

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

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

相关文章

Kafka-服务端-网络层

Reactor模式 Kafka网络层采用的是Reactor模式,是一种基于事件驱动的模式。熟悉Java编程应该了解JavaNIO提供了实现Reactor模式的API。常见的单线程Java NIO的编程模式如图所示。 为了满足高并发的需求,也为了充分利用服务器的资源,服务端需要…

Wimdows如何修改自己权限不够的文件

使用管理员身份运行cmd cd 文件目录 cd C:\Windows\System32\drivers\etc 打开文件 notepad 文件名 进行修改,保存就能成功!

基于springboot+vue的教师工作量管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

部署Filebeat+Kafka+ELK 集群

目录 Kafka 概述 为什么需要消息队列(MQ) 使用消息队列的好处 消息队列的两种模式 Kafka 定义 Kafka 简介 Kafka 的特性 Kafka 系统架构 在zookeeper集群的基础上部署 kafka 集群 部署zookeeper集群 部署kafka集群 下载安装包 安装 Kafka Ka…

Leetcode—22.括号生成【中等】

2023每日刷题&#xff08;七十九&#xff09; Leetcode—22.括号生成 算法思想 实现代码 class Solution { public:vector<string> generateParenthesis(int n) {vector<string> ans;int m n * 2;string path(m, 0);function<void(int, int)> dfs [&…

LabVIEW电火花线切割放电点位置

介绍了一个电火花线切割放电点位置分布评价系统&#xff0c;特别是在系统组成、硬件选择和LabVIEW软件应用方面。 本系统由两个主要部分组成&#xff1a;硬件和软件。硬件部分包括电流传感器、高速数据采集卡、开关电源、电阻和导线。软件部分则由LabVIEW编程环境构成&#xf…

数学建模学习笔记||层次分析法

评价类问题 解决评价类问题首先需要想到一下三个问题 我们评价的目标是什么我们为了达到这个目标有哪几种可行方案评价的准则或者说指标是什么 对于以上三个问题&#xff0c;我们可以根据题目中的背景材料&#xff0c;常识以及网上收集到的参考资料进行结合&#xff0c;从而筛…

java多线程(线程池)

1、创建一个可缓存线程池&#xff0c;如果线程池长度超过处理需要&#xff0c;可灵活回收空闲线程&#xff0c;若无可回收&#xff0c;则新建线程。 public static void main(String[] args) {ExecutorService cachedThreadPool Executors.newCachedThreadPool();for (int i …

基于Altium Designer 10设计双层印刷电路板的详细步骤

基于Altium Designer 10设计双层印刷电路板的详细步骤 一、基于Altium Designer 10设计双层印刷电路板总纲二、、基于Altium Designer 10设计双层印刷电路原理图三、制作集成库(包括原理图、PCB封装库、PCB 3D库)1、新建集成库2、新建原理图库3、绘制原理图库(1)、手工绘制…

02_Collection

文章目录 集合Java的集合类 Collectioniterator方法Collection的遍历 集合 在Java中&#xff0c;指的就是存放数据的容器&#xff0c;是一个载体&#xff0c;可以一次容纳多个对象。 解决Bug的两种方法&#xff1a; 打印 System.out.println();log.info(); debug 检查数据 …

CentOs7 安装Mysql(5.7和8.0版本)密码修改跳过 超详细教程

CSDN 成就一亿技术人&#xff01; 今天出一期Centos下安装Mysql&#xff08;详细教程&#xff09;包括数据库密码跳过修改 CSDN 成就一亿技术人&#xff01; 目录 1.获取安装包 2.安装程序 安装下载的rpm包 查看安装包 修改5.7版本&#xff08;重要&#xff09; 安装M…

【RHCE服务搭建实验】之DNS

目录 一、DNS简介二、安装DNS 一、DNS简介 域名系统&#xff08;DNS&#xff09;是一个分层的分布式数据库。它存储用于将Internet主机名映射到IP地址&#xff08;反之亦然&#xff09;的信息、邮件路由信息以及Internet应用程序使用的其他数据。 客户端通过调用解析器库在DNS…

股权众筹模式介绍(上)

众筹&#xff0c;是指个人或小企业通过互联网向大众筹集资金的一种项目融资方式&#xff0c;根据众筹的筹集目的和回报方式&#xff0c;可以分为债权众筹、回报众筹、股权众筹和捐赠众筹四大类。本文重点介绍我国股权众筹的几种模式。 一、众筹当事方 一个众筹项目&#xff0…

【ARMv8M Cortex-M33 系列 7 -- RA4M2 移植 RT-Thread 问题总结】

请阅读【嵌入式开发学习必备专栏 】 文章目录 问题小结栈未对齐 经过几天的调试&#xff0c;成功将rt-thead 移植到 RA4M2&#xff08;Cortex-M33 核&#xff09;上&#xff0c;thread 和 shell 命令已经都成功支持。 问题小结 在完成 rt-thread 代码 Makefile 编译系统搭建…

【LeetCode: 12. 整数转罗马数字 + 模拟 + 有序表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

WampServer

开发笔记 推荐链接php无法保存SESSION问题部署SSL时候产生的问题 推荐链接 链接目录 php无法保存SESSION问题 php.ini文件和phpForApache.ini 文件 里面都有 对路径的控制&#xff0c;相关路径问题可能也需要进行修改&#xff0c;打开文件搜索wamp64或wamp 就可以看到了&…

PowerShell install 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

透明拼接屏生产商:如何选择合格供应商

随着透明拼接屏市场的不断扩大&#xff0c;越来越多的生产商加入其中。对于需求方而言&#xff0c;选择一家合格的生产商至关重要。本文将围绕如何选择透明拼接屏生产商展开讨论&#xff0c;同时结合对尼伽OLED显示屏的了解&#xff0c;为您推荐这一领域的优质供应商。 一、透明…

springboot102基于web的音乐网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的基于web的音乐网站 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 …

网络防御保护1

网络防御保护 第一章 网络安全概述 网络安全&#xff08;Cyber Security&#xff09;是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断 随着数…