编程笔记 Golang基础 030 接口

2024-02-24 15:44

本文主要是介绍编程笔记 Golang基础 030 接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编程笔记 Golang基础 030 接口

  • 一、接口的定义:
  • 二、接口的实现:
  • 三、接收者类型
  • 四、应用示例
  • 五、接口的意义

在Go语言中,接口是一种类型定义,它描述了一组方法签名,任何实现了这些方法的类型都隐式地实现了这个接口。这种机制为Go提供了轻量级的面向对象特性,特别是多态性。

一、接口的定义:

接口定义的关键字是 interface,其基本语法结构如下:

type InterfaceName interface {Method1(paramList) returnTypesMethod2(paramList) returnTypes// ...
}

例如,定义一个简单的名为 Usber 的接口,它包含两个方法 Start()Stop()

type Usber interface {Start()Stop()
}

这意味着任何实现了 Start()Stop() 两个方法(无论方法体如何实现)的类型都将自动成为 Usber 接口的实现者。

二、接口的实现:

在Go中,接口的实现是隐式的。也就是说,你不需要像其他一些语言那样明确声明一个类型要实现某个接口。只要一个类型具有与接口所需相同名称和签名的方法,就认为该类型实现了接口。

例如,我们可以创建一个 Phone 结构体并为其添加 StartStop 方法:

type Phone struct {Name string
}func (p Phone) Start() {fmt.Println(p.Name, "is starting...")
}func (p Phone) Stop() {fmt.Println(p.Name, "is stopping...")
}// 此时,Phone 类型已经实现了 Usber 接口

三、接收者类型

在Go语言中,接口定义并不直接涉及接收者,而是对接口方法的签名进行描述。但接口的实现通常会涉及到类型的方法以及这些方法的接收者类型。

当我们在一个类型上定义方法时,可以指定两种类型的接收者:

  1. 值接收者

    type MyType struct {// ...
    }func (t MyType) MyMethod() {// ...
    }
    

    在这个例子中,MyMethod 的接收者是 MyType 类型的一个副本(值)。这意味着如果方法内部试图修改接收者字段,修改不会影响调用方法时传递的实际结构体实例,因为操作的是接收者的副本而非原始实例。

  2. 指针接收者

    func (t *MyType) MyMethod() {// ...
    }
    

    当方法接收者为指针类型时(如上面的例子),对方法内部接收者所做的任何修改都将反映到实际的结构体实例上,因为它是指向结构体实例的引用。

接口与接收者的关系在于,无论接收者是值还是指针,只要接口所声明的方法能在给定类型上找到匹配的方法,那么该类型就实现了这个接口。例如,如果有一个接口:

type SomeInterface interface {MyMethod()
}

无论是具有值接收者还是指针接收者的 MyMethod 方法,只要它们有相同的函数签名(不考虑接收者是否是指针),对应的类型都可视为实现了 SomeInterface 接口。

四、应用示例

package mainimport ("fmt"
)// 定义接口
type Usber interface {Start()Stop()
}// 实现接口的类型
type Phone struct {Name string
}// 实现接口的方法
func (p Phone) Start() {fmt.Printf("%s is starting...\n", p.Name)
}func (p Phone) Stop() {fmt.Printf("%s is stopping...\n", p.Name)
}func main() {// 创建 Phone 对象device := Phone{Name: "iPhone X"}// 将 Phone 类型赋值给 Usber 接口var usber Usber = device// 通过接口调用方法usber.Start()usber.Stop()// 类型断言检查if _, ok := usber.(Phone); ok {fmt.Println("The device is a phone.")}
}

在这个示例中,我们首先定义了 Usber 接口,然后创建了一个 Phone 结构体,并实现了 StartStop 方法。在主函数中,我们将 Phone 类型的对象赋值给 Usber 接口变量,并通过接口调用了相应的 methods。最后,使用类型断言来检查接口变量所指向的具体类型,从而在运行时确认它是哪种类型的实例。

五、接口的意义

接口在Go语言中的重要性体现在以下几个方面:

  1. 抽象和多态

    • 接口提供了类型抽象,它定义了一组方法签名,任何实现了这些方法的类型都可视为该接口的实现者。这样就可以通过接口来操作多种类型的值,而不必关心它们的具体类型,从而实现了多态。
    • 这种机制使得Go程序员可以编写更通用、更灵活的代码,提高了代码的复用性和可扩展性。
  2. 依赖注入与模块解耦

    • 在软件设计中,接口有助于降低不同组件之间的耦合度。通过使用接口作为函数或结构体的参数类型,可以在不改变接口使用者的情况下更换不同的实现,便于进行单元测试和组件替换。
  3. 标准库与第三方包的统一交互

    • Go的标准库广泛使用了接口设计,比如 io.Readerio.Writer 接口被各种读写操作所采用,无论底层是文件、网络连接还是内存缓冲区,只要实现了相应的接口就能以统一的方式处理数据。
    • 第三方包也经常通过定义和实现接口来提供功能扩展点,用户可以根据需要自定义满足接口的对象,与第三方包无缝对接。
  4. 类型安全

    • 虽然Go没有传统的类继承机制,但接口帮助弥补了这一空缺。接口可以确保不同类型的行为一致性,保证了类型安全的同时也增强了程序的设计规范性。
  5. 反射(Reflection)支持

    • Go的反射包 reflect 配合接口能够动态地获取和操作对象的方法和属性,进一步提升了Go语言在运行时的灵活性。
  6. 面向服务架构(SOA)与微服务

    • 在构建微服务或面向服务架构应用时,接口常被用于定义服务间通信契约,使得服务间的交互更加清晰和一致。

综上所述,接口在Go语言中是实现抽象、封装变化、促进代码重用以及设计灵活且松散耦合系统的关键要素之一。

这篇关于编程笔记 Golang基础 030 接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742572

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念