java鸭子类型_Golang中的接口与鸭子类型

article/2025/11/10 19:51:44

1 接口的定义与理解

接口是一个自定义类型,它是一组方法的集合。从定义上来看,接口有两个特点。第一,接口本质是一种自定义类型,因此不要将golang中的接口简单理解为C++/Java中的接口,后者仅用于声明方法签名。第二,接口是一种特殊的自定义类型,其中没有数据成员,只有方法(也可以为空)。

接口是完全抽象的,因此不能将其实例化。然而,可以创建一个其类型为接口的变量,它可以被赋值为任何满足该接口类型的实际类型的值。接口的重要特性是:

(1)只要某个类型实现了接口要的方法,那么我们就说该类型实现了此接口。该类型的值可以赋给该接口的变量;

(2)作为1的推论,任何类型的值都可以赋值给空接口interface{}

注意:这只是golang中接口的特性,为非所有类型的特性(接口是一种特殊的类型)。

接口的特性是golang支持鸭子类型的基础,即“如果它走起来像鸭子,叫起来像鸭子(实现了接口要的方法),它就是一只鸭子(可以被赋值给接口的值)”。凭借接口机制和鸭子类型,golang提供了一种游离于类、继承、模板之外的更加灵活强大的选择。

2 例子type Exchanger interface {

exchange()

}

type StringPair struct {

first, second string

}

type Point[2]int

func (sp *StringPair) exchange() {

sp.first, sp.second = sp.second, sp.first

}

func (p *Point) exchange() {

p[0], p[1] = p[1], p[0]

}

func exchangeThese(exchangers ...Exchanger) {

for _, exchanger := range exchangers {

exchanger.exchange()

}

}

func main() {

pair1 := StringPair{"abc","def"}

pair2 := StringPair{"ghi","jkl"}

point := Point{5, 7}

fmt.Println(pair1, pair2, point)

pair1.exchange()

pair2.exchange()

point.exchange()

fmt.Println(pair1, pair2, point)

// exchangeThese(pair1, pair2) //wrong

exchangeThese(&pair1, &pair2)

fmt.Println(pair1, pair2)

}

运行结果

75c32981674d28841a89622decda58c7.png

在本例中,自定义类型StringPair和Point指针实现了接口Exchanger所需的方法,因此该类型的值可以被赋值给接口的值。

但是,特别注意一点。如果使用exchangeThese(pair1, pair2)会导致编译错误(如下图),正确写法应当是exchangeThese(&pair1, &pair2)。这是由于真正满足接口Exchanger的类型是StringPair指针,而非StringPair。

2d8b6b780621133f979883804b75d1a6.png

在golang中,值接收者和指针接收者的方法集是不同的。只是golang会智能地解引用和取引用,使得二者的方法集看上去是一样的。但是,在调用exchangeThese时,就凸显出二者的不同了。


http://chatgpt.dhexx.cn/article/KB22DmEf.shtml

相关文章

编程语言中的 DUCK TYPING|python、c++、java、go

如果一只动物走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只动物就可以被称为鸭子。 许多编程语言都支持 Duck Typing ,通常 Duck Typing 是动态编程语言用来实现多态的一种方式。 在理解 Duck Typing 前,先看一张图片,…

Windows中采用命令行方式启动服务

1. 服务名不一定是你在服务面板看到的那个名,例如,你要打开被禁用的telnet服务,sc config telnet start auto,报错:[SC] OpenService FAILED 1060,因为telnet的服务名不是telnet而是tlntsvr, sc config tlntsvr start …

CentOS开启服务命令详解

一、学前须知 讲服务管理之前先了解下Linux的启动流程非常有必要,直观的先上CentOS的启动图: Centos7 Centos6的也补充下: 图片信息量较大,网友可根据自己的知识水平逐一按上图去填充自己,也欢迎指正;本节…

启动consul服务命令

启动Consul 安装配置好Consul以后,我们可以通过简单的命令启动consul。先来看最简单的启动方式: consul agent -dev 在新终端中,执行如上操作。 hongweiyulocalhost:~$ consul agent -dev > Starting Consul agent... > Consul agen…

Windows 服务快捷启动命令

Windows 服务快捷启动命令 gpedit.msc-----组策略sndrec32-----录音机nslookup----- ip地址侦测器…

Linux 系统启动与服务管理

文章目录 1. 前言2. Linux 系统启动过程2.1 开机自检2.2 MBR 引导2.3 GRUB 菜单2.4 加载 Linux 内核2.5 init 进程初始化2.6 系统启动过程总结 3. init 进程与 systemd3.1 init 进程3.2 Centos5/6/7 init 进程对比3.3 systemd3.4 systemd 单元类型3.5 运行级别对应的 systemd 目…

linux启动服务

查看开机启动项 1:systemctl list-unit-files --typeservice 2:systemctl list-unit-files --typeservice | grep enabled 3:systemctl list-unit-files --typeservice | grep disabled 开机停止某个服务: 1:sudo …

Linux常用启动服务命令

一、Nginx 1、启动 [root172 udm-web]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf2、重新加载配置文件 [root172 udm-web]# /usr/local/nginx/sbin/nginx -s reload二、防火墙 1、查看状态 systemctl status firewalld2、关闭防火墙 systemc…

Windows 启动服务命令大全

描述: 在日常工作学习中,可能会常用到windows系统自带的计算器、记事本、画图等小工具,本文将介绍如何使用命令快速打开这些小工具。 1、快速启动画图工具 在以下三个地方输入画图工具命令:mspaint ,然后按“Enter”或…

Ubuntu常用终端命令

Ubuntu常用终端命令 1.显示任务管理器: ps aux 2.kill进程: kill PID号 3.后台运行程序: nohup python3 xxxx.py & 4.查看文件列表 ls 5.进入文件夹 cd 文件夹名 6.解压与压缩命令 6.1.tar 文件 # 打包,非压缩 tar…

ubuntu在终端中打开文件管理器

打开ubuntu的终端,输入nautilus [path] 弹出资源管理器界面

UBUNTU 18.04开机自启动脚本实现--打开终端、执行命令及终端输入文字

开机自启动 方法很多,测试了一下,在18.04中最方便的方法如下: 新建sh脚本 touch xxx.sh gedit xxx.h然后输入: #!/bin/bash## xxx.sh## 你的代码#exit 0保存后退出,并在终端继续执行: chmod ax xxx.sh通…

Ubuntu终端打开文件及查看目录

方法/步骤 1 ctrlaltt,调出终端。------------ 要去某个目录,用cd 例如: cd /home/yang/下载/ 在视图中,后面还有一个文件夹,我记不住,就按tab键一下。就自动出来了。 如果该文件夹下东西比较多&#x…

解决Ubuntu新装系统终端打不开

一、问题说明 笔者新安装的虚拟机,操作系统为Ubuntu18.10,出现终端打不开的情况:应用–终端打不开,ctrlaltt没反应,进入文件管理器,右键–在终端中打开也没反应。 二、解决方法 进入设置,找到…

Ubuntu 打开多个终端

Ctrl Shift T,一个终端开启多个小终端 Ctrl Alt T 开启多个独立终端 Ctrl Shift 加号,放大终端字体 Ctrl 减号,缩小终端字体

ubuntu打开linux,ubuntu怎样打开终端(方法5种)

虽然这不是一编技术经验,但是想起来小编刚接触ubuntu的时候也不会打开终端,所以今天小编就给一些玩ubuntu的新手们,分享一下经验。 怎样打开终端 (方法1) 1 首先在桌面任意空白处,按CTRLALTT 2 这时就弹出终端窗口 (呵呵这招最好用…

Ubuntu20.04 终端打开不了的问题排查

Ubuntu20.04 终端打开不了的问题排查 今天用virtualbox安装了ubuntu20.04 问题:右键打开终端,怎么也打开不了! 点了也没反应,或者鼠标转小圈圈,然后也没有反应… 解决方法: 1、Ctrl Alt F6 先切换到终…

ubuntu开机自动打开终端输入命令且执行命令

打开终端 输入 gedit ~/.bashrc打开 .bashrc文件 之后把要执行的命令写入文件末尾 保存退出 source ~/.bashrc更新文件 此时,打开终端后,就会自动执行命令 如果有sudo命令需要运行,则使用echo 输入密码。 比如:echo “passwor…

【Linux】ubuntu 20无法打开终端的解决方法

前因: 我在开发板Firefly上,用的是ubuntu操作系统,因其本身默认是英文输入法,没有中文输入法。所以,我安装了中文输入法,结果安装好了后,发现终端已经打不开了。。。。。。 无论是右键、单击程…

如何在Ubuntu中用终端打开pycharm

首先得知道你把pycharm放在哪个文件夹里了,我这里是直接在桌面创建了一个Application文件夹专门存放软件包,下载的pycharm包就存放在这里。 找到路径后进入bin文件夹,里面有一个pycharm.sh文件,你直接双击是没有用的,这…