Go的接口与多态
什么是Go的接口?
接口可以说是一种类型,可以粗略的理解为他的变量是一堆方法。
一个简单的案例:
r,_ := http.Get("http://www.baidu.com")
io.Copy(os.Stdout,r.Body)
其中 io.copy 接受的变量是 io.Writer,io.Reader(实际上是接口类型)
而os.Stdout 和 r.Body 并不是这两种类型,但是他们实现了这两个接口,所以编译器可以识别出这是可行的的。
而 go 是怎么实现接口的呢?
可以假设 io.Reader 是这么写的:
type Reader interface{
funca()
funcb()
funcc()
}
那么在r.Body中会有如下架构:
type Body struct{
...
}
func (b Body)funca(){
...
}
func (b Body)funcb(){
...
}
func (b Body)funcc(){
...
}
在go中无需声明要实现什么接口,你只需要实现这个接口的所有方法就是直接显现了这个接口,也就是没有显示的实现接口的这一说法。
这里有一个有意思的地方。
很明显 结构体A 与结构体A 的指针是不同的类型
但 结构体A实现的方法对 A的指针有效,A的指针实现的方法对A无效
package main
import "fmt"
// duration是一个基于int类型的类型
type duration int
// 使用更可读的方式格式化duration值
func (d *duration) pretty() string {
return fmt.Sprintf("Duration: %d", *d)
}
// main是应用程序的入口
func main() {
duration(42).pretty()
// ./listing46.go:17: 不能通过指针调用duration(42)的方法
// ./listing46.go:17: 不能获取duration(42)的地址
}
多态
go利用接口实现多态的方式 简单粗暴
不同类型实现的同一接口,在接口调用时就会完美的体现出来
// 这个示例程序使用接口展示多态行为
package main
import (
"fmt"
)
// notifier是一个定义了
// 通知类行为的接口
type notifier interface {
notify()
}
// user在程序里定义一个用户类型
type user struct {
name string
email string
}
// notify使用指针接收者实现了notifier接口
func (u *user) notify() {
fmt.Printf("Sending user email to %s<%s>\n",
u.name,
u.email)
}
// admin定义了程序里的管理员
type admin struct {
name string
email string
}
// notify使用指针接收者实现了notifier接口
func (a *admin) notify() {
fmt.Printf("Sending admin email to %s<%s>\n",
a.name,
a.email)
}
// main是应用程序的入口
func main() {
// 创建一个user值并传给sendNotification
bill := user{"Bill", "bill@email.com"}
sendNotification(&bill)
// 创建一个admin值并传给sendNotification
lisa := admin{"Lisa", "lisa@email.com"}
sendNotification(&lisa)
}
// sendNotification接受一个实现了notifier接口的值
// 并发送通知
func sendNotification(n notifier) {
n.notify()
}
上述代码出自《Go语言实战》
Go的接口与多态的更多相关文章
- C#中的接口实现多态
我们都知道虚方法实现多态,抽象方法实现多态等,我们今天来看看如何使用接口实现多态 1.首先我们先要来了解了解什么是接口,它存在的意识 01.接口就是为了约束方法的格式(参数和返回值类型)而存在的 02 ...
- C#面向对象(三)接口实现多态
一.如何用接口实现多态? 1.定义一个接口. using System; using System.Collections.Generic; using System.Linq; using Syst ...
- No2_4.接口继承多态_Java学习笔记_经典案例
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import jav ...
- Java基础学习笔记八 Java基础语法之接口和多态
接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...
- java接口,接口的特性,接口实现多态,面向接口编程
package cn.zy.cellphone; /**接口是一种引用数据类型.使用interface声明接口,形式 * 形式:public interface 接口名称{} * 接口不能拥有构造方法 ...
- Java 基础 接口和多态
接口 接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的 ...
- Java 面向对象之接口、多态
01接口的概念 A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成 ...
- day03(接口,多态)
接口: 概念:是功能的集合,可以当做引用数据类型的一种.比抽象类更加抽象. 接口的成员: 成员变量:必须使用final修饰 默认被 public &a ...
- Java 接口和多态
接口 1.1 接口的概述 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样 ...
- 11_Java面向对象_第11天(接口、多态)_讲义
今日内容介绍 1.接口 2.多态 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的"类". 接口只描述所应该具备的方法,并没有具 ...
随机推荐
- Mysql安装和远程登录--Centos7
在Centos7中使用的包管理工具是yum,当然使用包管理工具安装也是最方便的. 本文操作内容需要在root用户下,否则有些步骤无法成功执行. 系统环境信息展示 安装 MySQL 提供的 RPM wg ...
- 从LLaMA-Factory项目认识微调
概述 什么是LLaMA-Factory? LLaMA-Factory是一个在github上开源的,专为大模型训练设计的平台.项目提供中文说明,可以参考官方文档:https://github.com/h ...
- 树莓派和esp8266之间使用tcp协议通信
树莓派代码: from flask import Flask, render_template import socket import threading app = Flask(__name__) ...
- node统计指定文件夹内代码行数
1. 来源 想对于自己接触前端日常学习与思考的代码行数进行一个统计,看自己大约敲了多少代码 2.代码 const fs = require('fs') const path = require('pa ...
- b站的视频进度条悬浮预览视频画面实现方式
1.探究 在看b站视频,滑到进度条的时候突发奇想,想知道这个预览图是怎么做到的 打开控制台,发现每次移动鼠标悬浮位置的时候都会发出一条网络请求,并且该请求的size显示来源于内存,当时以为每次加载视频 ...
- 监控最佳实践--redis及业务接口
简介: 监控最佳实践--redis及业务接口 1. 背景 1.1 问题 2020-12-04,客户侧redis集群版监控DB0 CPU突增至100%,导致数据库无法正常服务,经排查客户侧业务上存在2M ...
- Microsoft.Maui.Graphics.Skia 使用 DrawString 绘制文本的坐标问题
本文记录使用 Microsoft.Maui.Graphics.Skia 的 DrawString 进行绘制文本,不同的重载方法绘制的文本的坐标不同的问题 本文开始之前,预期已经准备好了环境和基础项目, ...
- CF633H (线段树维护矩乘 + 莫队)
Fibonacci-ish II 题意:给定一个长度最大为 \(30000\) 的序列,和最多 \(30000\) 个询问,每个询问问某区间 \([L,R]\) 里的数,去掉重复然后排序之后,依次乘上 ...
- python3生成随机单词或者语句
pip install RandomWords Random words: >>> from random_words import RandomWords >>> ...
- SAP集成技术(十)混合集成平台
混合集成平台hybrid integration platform (有时缩写为HIP)这个术语近年来被大量使用,但很多人可能不太清楚它的概念. 内容摘录自<SAP Interface Mana ...