Go 基础Interface

news2024/12/28 21:33:05

Go Interface

今天学习下Golang语言中Interface基本语法与使用,通过代码示例了解Go编程中的接口及其实现。跟Java语言类似,在Go编程中,开发者可以使用接口来存储一组没有实现的方法。也就是说,接口的方法不会有方法体。

接口定义

type Shape interface {
  area() float32
}

上述代码中定义了Shape接口,并定义了两个方法:area()perimeter(),这两个方法并没有任何逻辑实现。

接口实现

由于接口定义的是没有任何逻辑处理的方法,为了使用接口,开发者必须使用struct类型实现接口,完成接口方法所有的逻辑处理,例如

package main 
import "fmt"

// interface
type Shape interface {
  // 定义抽象方法 返回类型为float32
  area() float32
}

 // 定义接口实现 包含长宽 两个属性
type Rectangle struct {
  length, breadth float32
}

// 实现接口抽象方法 业务处理逻辑为 长 * 宽
func (r Rectangle) area() float32 {
  return r.length * r.breadth
}

// 方法参数: 接口类型
func calculate(s Shape) {
  fmt.Println("Area:", s.area())
}

// main function
func main() {
  // assigns value to struct members
  rect := Rectangle{7, 4}
  // call calculate() with struct variable rect
  calculate(rect)
}

运行代码

go run .

在这里插入图片描述

代码讲解

在上面的示例代码中,创建了一个Shape 接口,并定义一个area() 抽象方法,然后声明一个名称为 Rectangle 的struct类型实现接口

type Rectangle struct {
  length, breadth float32
}

Rectangle 实现接口函数的方式也很简单,只需要在函数前面加上 struct名称即可

func (r Rectangle) area() float32 {
  return r.length * r.breadth
}

定义一个计算函数,参数为 Shape接口类型,输出接口的计算结果

// access method of the interface
func calculate(s Shape) {
  fmt.Println("Area: ", s.area())
}

定义接口实现Rectangle的变量,作为参数传递给calculate函数

rect := Rectangle{7, 4}
calculate(rect)

多struct实现

在Go语言中,单接口支持多个struct实现,这一点跟java类似,单接口多实现。代码如下

package main 
import "fmt"

// interface
type Shape interface {
  area() float32
}

 // Rectangle struct implements the interface
type Rectangle struct {
  length, breadth float32
}

// Rectangle provides implementation for area()
func (r Rectangle) area() float32 {
  return r.length * r.breadth
}

// Triangle struct implements the interface
type Triangle struct {
  base, height float32       
}

// Triangle provides implementation for area()
func (t Triangle) area() float32 {
    return 0.5 * t.base * t.height
}

// access method of the interface
func calculate(s Shape) float32 {
  return s.area()
}

// main function
func main() {
 
  // assigns value to struct members
  r := Rectangle{7, 4}
  t := Triangle{8, 12}
 
  // call calculate() with struct variable rect 
  rectangleArea := calculate(r)
  fmt.Println("Area of Rectangle:", rectangleArea)
  
  triangleArea := calculate(t)
  fmt.Println("Area of Triangle:", triangleArea)

}

运行代码

go run .

在这里插入图片描述

在上述代码中,定义两个structs: Rectangle Triangle去实现Shape接口。每一个struct类型都需要实现area抽象方法。调用calculate方法时根据传递的具体接口实现,Go在语言层面自动调用具体的 struct

方法实现

如果一个接口定义多个抽象函数,struct 实现并没有实现接口的所有方法会怎样?来看下一段代码

package main 
import "fmt"

// interface
type Shape interface {
  area() float32
  perimeter() float32
}

 // Rectangle struct implements the interface
type Rectangle struct {
  length, breadth float32
}

// Rectangle provides implementation for area()
func (r Rectangle) area() float32 {
  return r.length * r.breadth
}

// access method of the interface
func calculate(s Shape) float32 {
  return s.area()
}

// main function
func main() {
 
  // assigns value to struct members
  r := Rectangle{7, 4}

  // call calculate() with struct variable rect 
  rectangleArea := calculate(r)
  fmt.Println("Area of Rectangle:", rectangleArea)
}

在这里插入图片描述

如上截图,如果struct实现没有实现接口所有函数,在运行时会报错。

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

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

相关文章

谷歌正开发苹果AirTag的竞品,但苹果Find My需求强劲

据安卓爆料专家 Mishaal Rahman 的消息,谷歌似乎正在开发苹果 AirTag 的竞品。 从图中可以看到,谷歌 Fast Pair 蓝牙快速配对中,出现了一个名为“Locator tag(定位器标签)”的分类,这一类别此前没有出现过…

RXXW300/汇川MD500变频器MODBUS通信应用指导手册

本篇博客属于工具文档篇,方便大家查询通信相关的参数和MODBUS地址,有关PLC的MODBUS通信大家可以参看下面的文章链接: PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)_RXXW_Dor的博客-CSDN博客_modbus读写冲突MODBUS通讯非常简单、应用也非常广泛,有些老生…

51单片机多路电压检测数码管显示( proteus仿真+程序+报告+讲解视频)

51单片机多路电压检测数码管显示演示视频1.主要功能:2.仿真3. 程序4.设计报告系统需求及方案设计5. 设计资料内容清单51单片机多路电压检测数码管显示( proteus仿真程序报告讲解视频)仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程…

MySQL从入门到精通(第二篇):MySQL的底层原理及其结构,结合多篇文章

Mysql进阶一、事务ACIDAUTOCOMMIT二、并发一致性问题1. 修改丢失三、封锁1. 封锁粒度2. 封锁类型读写锁意向锁3. 封锁协议1. 一级封锁协议2. 二级封锁协议3. 三级封锁协议4. 两段锁协议a. 概念b. 例子c. 两段锁是可串行化的充分条件d. 两段锁与死锁四、MySQL系统变量1. 查看系统…

苏嵌实训——day18

文章目录一 wirkeshark 抓包工具1.1 软件介绍1.2 软件安装1.3 wireshark工具的使用1.4 TCP三次握手和四次挥手二 TCP循环服务器2.1 IO多路复用2.2 使用select实现IO多路复用2.3 epoll一 wirkeshark 抓包工具 1.1 软件介绍 wireshark用于抓取经过我当前主机网卡的所有的数据包…

ffmpeg解封、解码实战

1 概述 2 解封装相关函数接口 avformat_alloc_context();负责申请一个AVFormatContext结构的内存,并进行简单初始化 avformat_free_context();释放该结构里的所有东西以及该结构本身 avformat_close_input();关闭解复用器。 avformat_open_input();打开输入视频文件 avformat_…

在elasticsearch中简单的使用script_fields

文章目录1、背景2、准备数据2.1 mapping2.2 插入数据3、案例3.1 格式化性别 1-男 2-女 -1-未知 如果不存在sex字段,则显示-- 其余的显示 **3.1.1 dsl3.1.2 java代码3.1.3 运行结果3.2 判断用户是否有某个爱好3.2.1 dsl3.2.2 java代码3.2.3 运行结果3.3 统计湖北的用…

Oracle 程序被编译后自动增加了AUTHID CURRENT_USER授权

目录 背景 原因: 解决方法 背景 今天遇到一个大坑,新建的一个数据库用户调用apps下的程序包,程序反馈未授权无法使用。 但是DBA确认已经给了授权。 查询授权表也是有正确授权的,但就是显示无效授权。 后来debug进去&#x…

外汇k线图经典图解:穿头破脚

从事外汇、黄金交易怎么能不懂K线图,学看K线图怎么能不把一些经典图解铭记心中呢?它们就好比字典和工具书,当投资者在解读行情时遇到任何困惑,都能从这些经典中得到指引,从而指明自己的投资方向。今天,小编…

java ssm校园二手书交易平台idea

该网站从实际运用的角度出发,运用了计算机网站设计、数据库等相关知识,网络和Mysql数据库设计来实现的,网站主要包括学生注册、学生登录、浏览图书、搜索图书、查看图书并进行购买,对购买的图书进行确认收货、退款退货、查看个人信…

Elasticsearch连续剧之实战篇Java操作es

作者:狮子也疯狂 专栏:《es》 坚持做好每一步,幸运之神自然会驾凌在你的身上 目录一、🐇前言二、🐇原生JAVA操作ES_搭建项目Ⅰ、创建项目Ⅱ、索引操作2.1 创建空索引2.2 给索引添加结构2.3 删除索引Ⅲ、文档操作3.1 新…

vCloud删除OVDC网络时提示被vApp网络使用无法删除

环境 VMware Cloud Director 版本:10.3.2.19375051 现象 在vCloud租户视图删除OVDC网络,提示被vApp网络使用,无法删除。此时通过查看vApp发现并没有残留vApp网络。 解决办法 1、登录vCloud数据库: 登录方法可以参考:VMware Cloud Director数据库操作 2、查逻辑网络: …

CAN接口电路设计

CAN总线的全称是控制器局域网络,主要应用在汽车电子和工业控制领域。和485总线一样,CAN总线也是一种半双工的通信。一条CAN总线最多能接110个节点它最高速率能到1Mbps,最远传输距离能到10KMCAN总线有两个信号,一个是CANH&#xff…

如何在 Linux 命令行中优雅的格式化输出 xml,记住这三种方法!

xml(可扩展标记语言)也是一种人类可读的标记语言,但是如同 json 文件一样,没有缩进格式(或者压缩)的 xml 文件,读起来那是挺头疼的。 首先来看一下我们这篇文章要达到的目的,如下图…

代码随想录训练营第十七天|110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

110.平衡二叉树 看完题后的思路 int[] f(root)if rootnull return [true,0]left[]f(root.left) if(!left[0]){return [false,-1]} right[]f(root.right) if(!right[0]){return [false,-1]} return[true,math.max(left[1],right[1])1] 思路 上面的过程弄复杂了,其…

Elasticsearch 入门到精通-Elasticsearch核心倒排索引数据结构

Elasticsearch 简介Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。Elasticsearch 建立在全文搜索引擎 Apache Lucene™ 基础上,通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤,从而很方便的使大量数据具有搜索、分析和探索…

vue插槽之插槽的用法及作用域插槽详解

目录前言一,插槽的基本使用1.1 引出插槽1.2 插槽的基本使用1.3 默认插槽1.4 插槽样式二,具名插槽2.1 引出具名插槽2.2 具名插槽的使用三,template标签3.1 引出template标签3.2 template标签的使用四,作用域插槽4.1 引出作用域插槽…

C语言小题,有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。(指向结构体数组的指针)

前言: 此篇是针对 指向结构体数组的指针 方面的练习。 解题思路: 用指向结构体变量的指针来处理: (1)声明结构体类型 struct Student ,并定义结构体数组,同时使之初始化; &#xff…

【Rust】9. 常见集合

9.1 Vector 9.1.1 创建 vector vector 只能储存相同类型的值!创建空的 vector:Vec::new()创建有值的 vector:vec! 宏 9.1.2 向 vector 中添加元素 9.1.3 读取 vector 的元素 索引语法:当引用一个不存在的元素时 Rust 会造成 pa…

设计模式-软件设计原则

目录 3.软件设计原则 3.1 开闭原则 3.2 里氏代换原则 3.3 依赖倒转原则 3.4 接口隔离原则 3.5 迪米特法则 3.6 合成复用原则 3.软件设计原则 在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要…