当前位置: 首页 > article >正文

【go从零单排】接口(interface)和多态(Polymorphism)

挪威特罗姆瑟夜景

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

在Go语言中,interface 是一种重要的类型,用于定义一组方法的集合。
任何类型只要实现了这些方法,就可以被视为该接口的实现。
接口提供了一种灵活的方式来实现多态性,使得不同类型可以用同一方法进行操作。

💻代码

package main

import (
	"fmt"
	"math"
)

// 用type和interface关键字定义了一个geometry接口,接口中包含了两个方法:area()和perim()
type geometry interface {
	area() float64
	perim() float64
}

// 定义结构体rect,包含两个属性width, height float64类型
type rect struct {
	width, height float64
}
type circle struct {
	radius float64
}

// 给结构体定义函数,rect和circle是不同的结构,实现不同的方法
func (r rect) area() float64 {
	return r.width * r.height
}
func (r rect) perim() float64 {
	return 2*r.width + 2*r.height
}

func (c circle) area() float64 {
	return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
	return 2 * math.Pi * c.radius
}

// measure()函数接受一个geometry接口类型的参数,并在函数内部调用该参数的area()和perim()方法,打印出对应的结果
func measure(g geometry) {
	fmt.Println(g)
	fmt.Println(g.area())
	fmt.Println(g.perim())
}

func main() {
	r := rect{width: 3, height: 4}
	c := circle{radius: 5}

	measure(r)
	measure(c)
}

🔍理解

  • 接口使用 type 关键字定义,后跟接口名称和方法签名
  • 任何类型只要实现了接口中定义的所有方法,就自动实现了该接口,无需显式声明。
  • interface是go中实现多态的方式:不同的数据结构实现相同的方法

💡 Tips小知识点

方法签名

在编程中,方法签名(Method Signature)是指方法的名称及其参数列表的组合。它用于唯一标识一个方法,并定义该方法的输入和输出。
方法签名通常包含:方法名称、参数列表(基本类型、结构体、interface接口)、返回值(可选)

Example:

func Add(a int, b int) int {
    return a + b
}
  • 方法名称:Add
  • 参数列表:a int, b int
  • 返回值:int

方法签名的重要性

  • 唯一性:在同一个作用域内,方法的名称和参数列表的组合必须是唯一的。即使方法名称相同,但如果参数类型或数量不同,编译器也会将其视为不同的方法。
  • 类型安全:方法签名帮助编译器检查方法调用时的参数类型是否匹配,确保类型安全。
  • 多态性:在面向对象编程中,方法签名是实现多态性的基础。通过接口或基类定义方法签名,可以让不同的子类实现相同的方法,从而实现多态。

空接口

空接口(interface{})是没有任何方法的接口,表示任何类型的值。它可以用来处理不同类型的数据。

Example:

//空的方法interface{}
func PrintAnything(v interface{}) {
    fmt.Println(v)
}

func main() {
    PrintAnything("Hello, World!")//string
    PrintAnything(123)//int
    PrintAnything(true)//boolean
}

接口的嵌套

接口可以嵌套其他接口,从而形成更复杂的接口。

Example:

type Animal interface {
    Speak() string
}
//嵌套Animal接口,并新增一个Play方法
//意味着任何实现 Pet 接口的类型,必须同时实现 Animal 接口中的 Speak() 方法和 Pet 接口中的 Play() 方法。
type Pet interface {
    Animal
    Play() string
}

type Dog struct{}
//dog 实现Speak()
func (d Dog) Speak() string {
    return "Woof!"
}
//dog 实现Play()
func (d Dog) Play() string {
    return "Fetch!"
}

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述


http://www.kler.cn/a/386650.html

相关文章:

  • 第 13 章 -Go 语言 接口
  • ABAP开发学习——ST05 ABAP SQL跟踪工具
  • datastage在升级版本到11.7之后,部分在11.3上正常执行的SP报错SQLSTATE = 22007: 本机错误代码 = -180
  • 排序算法 -快速排序
  • 会话信息处理: HttpSession、token序列化、收集登录设备信息、基于`spring-session-data-redis`实现session共享。
  • 微澜:用 OceanBase 搭建基于知识图谱的实时资讯流的应用实践
  • Day 51 || 647. 回文子串、516.最长回文子序列
  • 青少年编程与数学 02-003 Go语言网络编程 11课题、Go语言网络编程
  • qt QHttpMultiPart详解
  • 学习记录:js算法(八十八):分割回文串
  • 关于 el-table 的合计行问题
  • 接收nVisual中rabbitmq数据不成功问题排查
  • LeetCode30:串联所有单词的子串
  • ElasticSearch向量检索技术方案介绍
  • 设计模式之原型模式(上机考试多套试,每人题目和答案乱序排列场景)
  • YOLO11 旋转目标检测 | 数据标注 | 自定义数据集 | 模型训练 | 模型推理
  • 导师双选系统开发:Spring Boot技术详解
  • 在ubuntu2204上以 All-in-One 模式安装 KubeSphere
  • koa安装与使用
  • 【数据结构-合法括号字符串】力扣1963. 使字符串平衡的最小交换次数
  • shell中执行hive指令以及hive中执行shell和hdfs指令语法
  • 安卓逆向之socket抓包
  • 系统架构设计师论文:单元测试方法及其运用
  • 算法每日双题精讲——双指针(有效三角形的个数,和为s的俩个数)
  • Java-字符串常量池
  • WPF之iconfont(字体图标)使用