Go语言学习-接口

Go语言学习笔记—golang接口与实现面向对象特性 golang没有面向对象的概念,但是通过接口可实现面向对象的特性——继承封装多态 阅读详情

Go语言中虽然没有传统面向对象语言中类、集成的概念,不过提供了接口的支持,可以使用接口来使用一些面向对象的特性。

在 go 语言中,的接口有下面几个特点:

  • 可以包含0个或多个方法的签名
  • 只定义方法的签名,不包含实现
  • 实现接口不需要显式的声明,只需实现相应方法即可

接口的定义

定义方式如下:

type Namer interface {
    method1(param_list) return_list
    method2(param_list) return_list
    ...
}

这里的 Namer 就是接口的名字,只要符合标识符的规则即可。不过,通常约定的接口的名字最好以 er, r, able 结尾(视情况而定),这样一眼就知道它是接口。

实现接口

在 go 中实现接口很简单,不需要显式的声明实现了某个接口,想要实现某个接口,只需要实现接口中的所有方法即可。

package main

import "fmt"
import "math"

type Shaper interface {
    Area() float32
    Circumference() float32
}

type Rect struct {
    Width float32
    Height float32
}

type Circle struct {
    Radius float32
}

func (r Rect) Area() int {
    return r.Width * r.Height
}

func (r Rect) Circumference() int {
    return 2 * (r.Width + r.Height)
}

func (c Circle) Area() int {
    return math.Pi * c.Radius * c.Radius
}

func (c Circle) Circumference() int {
    return math.Pi * 2 * c.Radius
}

func main() {
    r := Rect{10, 20}
    fmt.Printf("Rect w: %f, d: %f, Area: %f, Circumference: %f", r.Width, r.Height, r.Area(), r.Circumference())

    c := Circle{5}
    fmt.Printf("Circle r: %f, Area: %f, Circumference: %f", c.Radius, c.Area(), c.Circumference())    
}

上面我们定义了一个 Shaper 的接口,其中包含两个方法 Area 和 Circumference,分别用来计算面积和周长。然后我们定义了两个结构体 Rect, Circle 并分别实现了这两个方法。但是上面的程序似乎并没有体现出接口和两个实现类型的关系,下面我们将他们关联起来使用:

func showInfo(s Shaper) {
    fmt.Printf("Area: %f, Circumference: %f", s.Area(), s.Circumference())
}

注意,这里方法的参数是一个接口类型的,因此我们可以将实现接口的类型的实例传递进去,像下面这样:

r := Rect{10, 20}
showInfo(r)

c := Circle{5}
showInfo(c)

获取实现接口的实际类型

在上面的 showInfo 中我们传入了接口类型的对象,如果将实现了接口的类型传递进去,那么会将实际类型的其他特性掩盖住,因此通常我们会想要获取其真正的类型, 可以使用下面的方法:

func showInfo(s Shaper) {
    switch s.(type) {
    case Rect:
        fmt.Println("This is Rect")
    case Circle:
        fmt.Println("This is Circle")        
    }
    fmt.Printf("Area: %f, Circumference: %f\n", s.Area(), s.Circumference())
}

另外可以使用类型断言,来判断某一时刻接口是否是某个具体类型

v, ok := s.(Rect)   // s 是一个接口类型

如果 s 此时实际上是 Rect 类型,那么会将 s 转换为 Rect 类型,并且 ok 为 true。否则 ok 为 false。

标准库中的常用接口

io.Reader 和 io.Writer

这两个接口定义了实现io功能的基本操作,因此某种类型只要实现了这两个接口就可以进行io操作。

Reader 接口的定义为:

type Reader interface {
    Read(p []byte) (n int, err error)
}

仅仅只有这一个方法,Read方法将从数据流中读取 len(p) 个字节的数据到字节数组 p 中,并且返回读取的字节数(即使发生了错误,n也会返回已经读取的字节数)。

我们可能会经常用到的实现了 Reader 接口的对象有: os.Stdin(标准输入), os.File的实例(文件对象)等等, 我们可以对其调用 Read 方法来读取数据。

Writer 接口的定义:

type Writer interface {
    Write(p []byte) (n int, err error) 
}

Write 将 len(p) 个字节的数据从 p 中写入到基本数据流中。写入的字节数 n(0 <= n <= len(p))以及任何遇到的引起写入提前停止的错误。

类似的实现了 Writer 接口的对象有: os.Stdout, os.Stderr, os.File 等等。可以使用 Write 方法向其中写入数据。

标准库中定义了很多的接口,这里只是简单的提一下,更多内容还是要去查看标准库的文档。

【Go语言学习系列10】Go基础语法(八):接口 深入解析Go语言接口的工作原理、类型断言与实战应用技巧,掌握这一强大的抽象机制,提升代码灵活性与可维护性 阅读详情

相关推荐

Go语言学习 二十 接口

本文最初发表在我的个人博客,查看原文,获得更好的阅读体验 接口是一组方法的集合,接口类型的方法集是其接口。在Go中,接口的实现无需显示指明,只需要实现类型实现了一个接口的所有方法,就表示该类型实现了该接口,这种实现方式也称为隐式实现。隐式接口实现解耦了接口的定义,这样,可以在任何包中实现一个接口,同时,也使得接口的定义更加明确。 一 接口 1.1 接口声明 接口的声明需要使用interface关...

红嘴奎利亚雀 的专栏 428

go语言学习-接口

Go语言中虽然没有传统面向对象语言中类、集成的概念,不过提供了接口的支持,可以使用接口来使用一些面向对象的特性。 在 go 语言中,的接口有下面几个特点: 可以包含0个或多个方法的签名 只定义方法的签名,不包含实现 实现接口不需要显式的声明,只需实现相应方法即可 接口的定义 定义方式如下: type Namer interface { method1(param_list) ...

dengfengjiang3675的博客 197

开源滑翔伞升降速度表:基于STM32与传感器融合的DIY飞行仪表

传感器融合是现代嵌入式系统与物联网设备中的核心技术,它通过整合多个传感器的数据,利用滤波与估计算法,获得比单一传感器更精确、更可靠的环境感知能力。其技术价值在于提升系统的鲁棒性、精度和上下文理解能力,广泛应用于无人机导航、可穿戴设备、工业监测及智能驾驶等领域。本文聚焦于一个具体的工程实践案例——开源多功能滑翔伞升降速度表(Open-Vario),该项目巧妙地运用了**卡尔曼滤波器**进行气压与GNSS数据的融合,以精确计算升降率,并基于**FreeRTOS**实时操作系统构建了一个稳定、可扩展的嵌入式平台,

weixin_33657398的博客 176

Golang的终端循环输入io.Copy(*,os.Stdin)

1、io.Copy(dst Writer, src Reader)(written int64, err error) haypin@MBP  /usr/local/go/src/osgo doc io.Copy package io // import "io" func Copy(dst Writer, src Reader) (written int64, err error) Copy copies from src to dst until either EOF is rea

HayPinF的博客 1733

计算机视觉-全景图像拼接中的特征匹配与优化策略

本文深入探讨了计算机视觉中全景图像拼接的核心技术,重点解析了特征匹配后的关键优化策略。通过SIFT特征提取、RANSAC算法剔除误匹配,并结合APAP算法应对视差与鬼影问题,详细阐述了从基础对齐到无缝融合的完整流程,为开发者实现高质量全景拼接提供了实用指南。

weixin_29039773的博客 361

侧杆试验 - 高速撞击 - 显式动力学 - ANSYS Workbench

显式动力学是一种时间积分方法,用于在速度很重要时执行动态模拟。显式动力学考虑快速变化的条件或不连续事件,例如自由落体、高速撞击和施加的负载。由于这些“非线性动力学”已集成到模拟中,因此显式动力学是模拟高度瞬态物理现象的首选。有些侧面碰撞是指车辆侧向撞上路边的坚硬物体,如树木或电线杆。这通常是由于驾驶员失去控制、超速、误判拐角或在湿滑路面上打滑造成的。

jianqimingtian的博客 1289

从Java到Go语言学习笔记 - Golang中有趣的接口实现

先来看看Java接口实现,先定义一个User类,用于传递对象值。 public class User { String name; String email; public User(String name, String email){ this.name = name; this.email = email; } } 再定义一个接口 public interface Notifier { public void notifyF

happy_85的专栏 377

Aruba CX交换机 初始化配置

Aruba CX 交换机 6000系列 8000系列交换机配置

Harry_Guo 1834

Go 语言学习 Protobuf 连接 gRPC 实现 AI 接口

本文介绍了使用Protobuf和gRPC实现AI接口的技术方案。首先讲解了Protobuf的安装与使用,包括.proto文件定义和Go代码生成;其次介绍了gRPC基础,包含服务端和客户端的实现方法;最后展示了如何将AI模型封装为gRPC服务,并提出了负载均衡、缓存机制等优化措施。该方案结合Go语言的高性能特性、Protobuf的高效序列化和gRPC的低延迟通信优势,能够构建高效、可扩展的AI接口,支持跨语言集成,为AI应用开发提供了可靠的技术基础。

hsuhwsb的博客 823

FPGA控制DDR读写(AXI4总线接口)

FPGA控制DDR读写

qq_42712308的博客 1万+

[网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析

这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步。前文分享了通过Python利用永恒之蓝漏洞加载WannaCry勒索病毒,并实现对Win7文件加密的过程,但过程较为复杂,为什么不直接利用永恒之蓝呢?所以,这篇文章将直接分享MSF利用MS17-010漏洞进行反弹Shell,再上传勒索病毒进行实验复现,并详细讲解WannaCry勒索病毒的原理。基础性文章,希望对您有所帮助。

杨秀璋的专栏 1万+

Go语言学习笔记-接口

Go语言的接口是一种抽象的类型。 不用去理解那么复杂抽象的解释,就记住Go语言的接口是一种类型就行。 Go语言的接口是一种类型就行 Go语言的接口是一种类型就行 Go语言的接口是一种类型就行 接口定义格式 type 接口名称 interface{ 方法名1( 参数列表1 ) 返回值列表1 方法名2( 参数列表2 ) 返回值列表2 … } 接口名称一般会在后面加上er,如writer。接口名最好要能突出该接口的类型含义。 方法名首字母大写可被其他包调用。 参数类表和返回值裂变的名称可以省略。 //接口定义

weixin_42523416的博客 155

LVGL 组件对齐方式说明

本文说明 LVGL(以 v8 为例)中常用的 lv_align_t对齐选项的含义与用法,对应界面设计工具里下拉列表中的以及等命名。

摸鱼专家 130

【Go语言学习系列34】数据库编程(一):SQL接口

详细介绍Go语言标准库中的database/sql包,包括数据库连接、查询操作、事务处理、NULL值处理等,帮助你构建可靠的数据库应用程序

GopherTribe的博客 1065

蓝牙攻防实战:蓝牙技术详解

蓝牙作为轻量级、低功耗的无线通信技术,其设计兼顾了效率与灵活性,但也留下了诸多安全隐患。随着物联网设备的爆发式增长,蓝牙的攻击面也在不断扩大。理解其底层通信机制、协议栈结构以及配对加密逻辑,是提升无线安全防护能力的关键。

idlecloud0105的博客 738

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Go语言学习笔记——接口

文章目录声明接口实现接口接口嵌套接口和类型转换接口断言空接口类型interface{}空接口与其他类型转换空接口比较类型分支参考资料   接口是一种提供给调用方和实现方遵守的协议约定,大家都按照统一的命名、参数表、返回值定义/使用实现了该接口的方法   Go的接口设计是非侵入式的,接口编写者无须知道接口被哪些类型实现;接口实现者只需知道实现的接口是什么样子,无须指明实现了哪一个接口。这种隐式的实现,解除了实现类与接口间的强耦合关系 声明接口 type Invoke interface { Call(i

IuSpet的博客 413

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Go语言学习[8]_结构体、方法、接口

Go语言学习 道法自然 文章目录Go语言学习前言一、结构体1.1结构体定义1.2操作结构体1.3 标签1.4 内嵌结构体二、 方法2.1 方法定义2.2 方法接收者三、 接口3.1 接口定义3.2 实现接口3.3 类型断言3.4 空接口总结 前言 Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言语法简单,包含了类C语法。快速的编译时间,开发效率和运行效率高。组合的思想、无侵入式的接口。 一、结构体 Go 语言中没有“类”的

牛博通的博客 311

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

GO语言学习-接口interface

GO语言学习-接口interface接口定义接口执行机制 接口:多个方法声明的集合,只关心做什么 go中可以先实现类型,再抽象出所需接口 接口可以减少用户可视方法,屏蔽内部结构和实现细节。 但是会有运行期开销。 通常用在对外包提供访问或预留扩展空间 接口定义 1.不能有字段 2.不能定义自己的方法 3.不能实现方法,只能声明方法 4.可以嵌入别的接口类型——不能有同名方法(不支持重载);也不能自身...

Mrong1013967的博客 251

Go语言学习—Day8—结构体、方法、接口

weixin_43868320的博客 114

GO语言学习系列十——GO的接口(Interface)

# 接口(interface) GO语言的接口是非常灵活的,它通过一种方式来声明对象的行为,谁实现了这些行为,就相当于实现了这个接口 接口里面声明各种方法的集合,但接口本身不去实现这些方法所要的一些操作,因为这些方法没有被实现,所以它们是抽象的方法,这就非常像其它语言里面向对象的实现抽象方法一样,只不过其它语言需要继承然后去实现相对应的方法,而GO不需要继承,你只要在...

astarblog的博客 168

Go语言学习心得--Go语言接口

Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 老规矩,回忆JAVA的接口,Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现。 Java接口的方法只能是抽象的和公开的,Java接口不能有构造器,Java接口可以有public、static和final属性。 至于接口实现这些,就...

懿的博客 377

【Go语言学习】——接口

接口

Kaychenl的博客 192

GO语言学习(九)

第九期:讲解了数据库接口相关的知识,分析了相关方法接口的实现和学习思路,一步步深入理解相关数据库接口知识

wktomo的博客 1395

Go语言学习笔记之接口interface

go自学

qq_43170570的博客 772

Go语言学习6:接口

接口定义了一组方法,但是这些方法不包含实现代码(它们是抽象的),接口里也不能包含变量。 接口指定了一个类型应该具有的方法,并由该类型决定如何实现这些方法。类型通过实现一个接口的所有方法来实现该接口。 package main import ( &quot;fmt&quot; ) type SalaryCalculator interface { CalculateSalary() int } t...

login_sonata的博客 437

go语言学习(第七章,接口)(go 语言学习笔记)

7.1 定义 接口代表一种调用契约,是多个方法声明的集合。 在某些动态语言中,接口(interface)也被称为协议。准备交互的双方,共同遵守事先约定的规则,使得在无须直到对方身份的情况下进行协作。接口要实现的是做什么,而不关心怎么做,谁来做。 接口解除了类型依赖,有助于减少用户可视方法,屏蔽内部结构和实现细节。似乎好处很多,但这并不意味着可以滥用接口,毕竟接口实现机制会有运行期间开销。对于相同包...

luslin1711的博客 273
上一篇: 1.游戏开发之协议的定义过程
下一篇: go语言学习-go语言中的方法
SpringBears
博客等级 码龄9年 2粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值