golang 切片 接口_如何理解Golang中的接口?

个人认为,要理解 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{} = 1

fmt.Println(i)

}

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

总结

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

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

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

相关文章

batchnomal_pytorch的batch normalize使用详解

torch.nn.BatchNorm1d()1、BatchNorm1d(num_features, eps 1e-05, momentum0.1, affineTrue)对于2d或3d输入进行BN。在训练时,该层计算每次输入的均值和方差,并进行平行移动。移动平均默认的动量为0.1。在验证时,训练求得的均值/方差将用于标…

phpcms文件所需权限

转载于:https://www.cnblogs.com/zhongheng/p/4684087.html

mysql 设置大小写_mysql修改大小写参数注意事项

原由:数据库中原本参数lower_case_table_names的值为0,应开发要求需要修改为不区分大小写,即修改为1。但是修改完之后,发现本来建立的大写字母的表查不到。修改过程1,在参数文件中修改lower_case_table_names12&#x…

论文中如何写mysql的介绍_mysql优化写论文,从哪几方面入手啊解决方法

引用第7章:优化目录7.1. 优化概述7.1.1. MySQL设计局限与折衷7.1.2. 为可移植性设计应用程序7.1.3. 我们已将MySQL用在何处?7.1.4. MySQL基准套件7.1.5. 使用自己的基准7.2. 优化SELECT语句和其它查询7.2.1. EXPLAIN语法(获取SELECT相关信息)7.2.2. 估计…

如何理解java回电话

同android中间Button的setOnClickListener这个回调案例; Button button (Button)this.findViewById(R.id.button); button.setOnClickListener(new Button.OnClickListener() {//回调函数overridepublicvoid onClick(View v) {buttonTextView.setText("按钮被…

python mysql 时间比较大小_python时间函数与mysql时间函数转换

时间相关操作,时间有三种表示方式:时间戳 1970年1月1日之后的秒,即:time.time()格式化的字符串 2014-11-11 11:11, 即:time.strftime(%Y-%m-%d)结构化时间 元组包含了&#x…

springMVC 前后台日期格式传值解决方式之二(共二) @InitBinder的使用

关于springmvc日期问题的解决方式 除了本博客的【springMVC 前后台日期格式传值解决方式之 DateTimeFormat的使用和配置】一文, 还有如下这种方式: 在Controller里加上这段代码: 1 InitBinder2 public void initBinder(ServletRequestDataBinder…

mysql npe问题_MySQL为Null会导致5个问题,个个致命!

本文转载自微信公众号「Java中文社群」,作者磊哥。转载本文请联系Java中文社群公众号。正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如下图所示:“兵马未动粮草先行”,看完了相关的配置之后&#xff0c…

line-height 与垂直居中!

在此之前,对于line-height 与垂直居中的问题,经常碰到。 比如,图片与span在同一个box中的时候,竟然会各种偏移。要想达到理想的效果真的是各种难。 有时间,决定认真的啃一啃。 一 line-heigtht: 1. line-height: 顾名…

暑假集训-个人赛第六场

这场比赛,不提也罢。 A转载于:https://www.cnblogs.com/macinchang/p/4693690.html

mysql优化插入速度的方法_优化MySQL插入方法的五个妙招

以下是涉及到插入表格的查询的5种改进方法:1)使用LOAD DATA INFILE从文本下载数据这将比使用插入语句快20倍。2)使用带有多个VALUES列表的INSERT语句一次插入几行这将比使用一个单行插入语句快几倍。调整bulk_insert_buffer_size变量也能提高(向包含行的表格中)插入…

数据结构导论(一)

导读:在看书前,我对这本书的内容,是 这么想的:数据结构,那大概就是关于数据和结构的东西。而讲到数据,估计会说到数据类型,数据定义,数据存储等方面。然后在结构方面,就不…

基于java的汽车维修保养智能预约系统论文

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…

mysql无法添加或更新子行_MySQL错误1452-无法添加或更新子行:外键约束失败?

每当我们在表之间添加外键约束并将记录插入子表中时,都会发生此错误。让我们来看一个例子。创建子表。mysql> create table ChildDemo-> (-> id int,-> FKPK int-> );创建第二个表。mysql> create table ParentDemo-> (-> FKPK int,-> N…

YIi2中checkboxOptions前选框的用法

这是checkboxOptions前选框的用法 use yii\grid\GridView; $this->registerJs(" $(#selection_all).click(function(){ $(input[nameselection_all]).click(); }); $(#delete_select).click(function(){ var selection $(#w0).yiiGridView(getSelectedRows); if(selec…

python顺序执行 toggle_pythonkivymd:如何使toggle_nav_drawer()函数工作?

我的kv代码有问题。我想用几个NavigationDrawerIconButtons创建一个MDNavigationDrawer。窗口会出现,但当我单击MDToolbar时,程序崩溃并显示此错误消息。在Traceback (most recent call last):File "C:/Users/path/to/my/file/main.py", line …

Angularjs+Nodejs图片上传

1.插件 (1) &#xff1a;angular插件 ng-file-upload (2) : nodejs插件connect-multiparty 2.html <input type"file" ngf-select ng-model"files" ngf-multiple"true" /> 3.配置 var app angular.module(fileUpload, [ngFileUpload]);可…

mysql 日志同步 数据不同步_Mysql互为主从问题--日志同步数据不同步

Mysql互为主从问题--日志同步数据不同步我搭建的是mysql互为主从 复制两台机器的mysql环境完全相同第一部分测试&#xff1a;B为master A为slave的同步测试在B上创建表lian&#xff0c;并插入数据mysql> create table lian (a int,b char(10));mysql> insert into lian (…

UVALive 4764 dp

DES: 这是一个新的游戏。给你一套牌、编号从1到100000.正常来说。你手中的牌和这次翻的牌是一样的&#xff0c;就会加一分。但是。如果是999的话。加三分。所以问你最大的分是多少。 貌似是简单的DP吧。&#xff08;DP菜鸟...再简单我也不会...T_T...&#xff09;于是...我看懂…

mysql数据库事务命令_MySql学习18----数据库事务---命令使用(02)

本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作。下一篇会讲述如何使用JDBC进行数据库的事务操作。事务是指数据库中的一组逻辑操作&#xff0c;这个操作的特点就是在该组逻辑中&#xff0c;所有的操作要么全部成功&#xff0c;要么全部失…