9.2 Go 接口的实现


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • 接口的定义与特性
        • 接口的声明
        • 接口的实现
      • 接口的底层实现
        • 空接口
        • 接口的动态类型
      • 接口的使用技巧
        • 1. 避免使用空接口
        • 2. 利用接口实现多态
        • 3. 接口作为函数参数
        • 4. 接口嵌入
        • 5. 接口与错误处理
        • 6. 接口与类型断言
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
Go 语言以其简洁、高效和并发性而著称,而接口(Interface)作为 Go 语言的核心特性之一,为开发者提供了强大的抽象能力。本文旨在深入探讨 Go 接口的实现原理,并分享一些实用的使用技巧。

接口的定义与特性

在 Go 语言中,接口是一种包含一组方法签名的类型,它不包含任何实现代码。接口的实现是隐式的,这意味着任何类型只要实现了接口中的所有方法,就自动满足了该接口。

接口的声明

接口可以通过以下方式声明:

type MyInterface interface {DoSomething()DoAnotherThing()
}

接口的实现

任何类型,只要实现了接口中的方法,就自动实现了该接口:

type MyStruct struct {// 结构体字段
}func (s *MyStruct) DoSomething() {// 实现方法
}func (s *MyStruct) DoAnotherThing() {// 实现方法
}

接口的底层实现

Go 的接口实现基于两个元素:类型信息和数据。每个接口值实际上包含两个元素:一个指向具体类型信息的指针,和一个指向具体值的指针。

空接口

Go 语言中的空接口(empty interface)interface{} 包含任何类型:

var i interface{}
i = "Hello"
i = 42

接口的动态类型

使用 reflect 包可以检查接口的动态类型:

var i interface{} = "hello"
t := reflect.TypeOf(i)
fmt.Println("Type:", t)

接口的使用技巧

1. 避免使用空接口

空接口允许任何类型的值,但这样会失去类型安全,因此应尽量避免使用空接口。

2. 利用接口实现多态

接口允许你编写多态的代码,即同一个函数可以接受不同类型的参数,只要这些参数实现了相同的接口。

3. 接口作为函数参数

将接口作为函数参数可以提高函数的通用性:

func DoSomethingWithInterface(i MyInterface) {i.DoSomething()
}

4. 接口嵌入

Go 语言允许在结构体中嵌入接口,这样可以扩展结构体的功能:

type MyInterface interface {DoSomething()
}type ExtendedInterface interface {MyInterfaceDoExtraThing()
}type MyStruct struct {MyInterface
}

5. 接口与错误处理

接口可以用于定义错误处理策略,例如:

type ErrorHandler interface {HandleError(error)
}func ProcessData(d Data, h ErrorHandler) {if err := d.Validate(); err != nil {h.HandleError(err)}
}

6. 接口与类型断言

类型断言允许你检查接口变量中存储的具体类型,并访问其方法或属性:

var i interface{} = "hello"
s, ok := i.(string)
if ok {fmt.Println(s)
}

总结

Go 的接口提供了一种强大的方式来实现抽象和多态,使得代码更加灵活和可扩展。理解接口的实现原理和掌握一些使用技巧,可以帮助开发者写出更加优雅和高效的代码。希望本文能够为 Go 语言的开发者提供一些有价值的见解和指导。

Go 基础目录:https://blog.csdn.net/sxc1414749109/article/details/137843832


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark作业运行异常慢的问题定位和分析思路

一直很慢 🐢 运行中状态、卡住了,可以从以下两种方式入手: 如果 Spark UI 上,有正在运行的 Job/Stage/Task,看 Executor 相关信息就好。 第一步,如果发现卡住了,直接找到对应的 Executor 页面&a…

深度解析:AI Prompt 提示词工程的兴起、争议与未来发展

PART1: 提示词工程的兴起 在人工智能领域中,一个新的领域——提示词工程(prompt engineering)——开始显露头角。 这个领域的核心在于精心设计输入,以引导AI模型产生特定的、期望的输出。 随着AI技术的飞速发展,特别…

[Linux] 软链接使用绝对路径的重要性

文章目录 软链接使用绝对路径的重要性软链接路径复制软链接查看文件类型 软链接使用绝对路径的重要性 软链接路径 软链接必须指定绝对路径,否则复制软链接后,由于软链接的相对路径是从软链接所处位置开始解析的,因此使用相对路径的软链接可…

查询SQL02:寻找用户推荐人

问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析: 这题主要是要看这null值会不会用,如果说Java玩多了,你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…

【实战项目二】Python爬取豆瓣影评

目录 一、环境准备 二、编写代码 一、环境准备 pip install beautifulsoup4 pip intall lxml pip install requests我们需要爬取这些影评 二、编写代码 我们发现每个影评所在的div的class都相同,我们可以从这入手 from bs4 import BeautifulSoup import request…

Java面试八股之什么是反射,实现原理是什么

Java中什么是反射,实现原理是什么 Java中的反射(Reflection)是一种强大的特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。简而言之,反射机制使得程序能够在运行时动态地了解和使用自身或其他程序集中…

如何用群晖当异地组网服务器?

在当今信息化时代,远程通信成为了企业和个人之间不可或缺的一部分。特别是对于跨地区的通信需求,一个可靠的异地组网服务器是必不可少的。而群晖(Synology)作为一款功能强大的网络存储设备,可以被用作办公室或家庭的异…

pytorch笔记:自动混合精度(AMP)

1 理论部分 1.1 FP16 VS FP32 FP32具有八个指数位和23个小数位,而FP16具有五个指数位和十个小数位Tensor内核支持混合精度数学,即输入为半精度(FP16),输出为全精度(FP32) 1.1.1 使用FP16的优缺…

计算机组成原理复习笔记

前言 就是按照考试的题型写的总结 非常应试版 题型 一、进制转换 只考 十进制 二进制 十六进制 之间的相互转换 一个个看 (1)十进制 转其他 转二进制:除以2 从小到大取余数(0或1) 转十六进制 : 除以1…

摆脱Jenkins - 使用google cloudbuild 部署 java service 到 compute engine VM

在之前 介绍 cloud build 的文章中 初探 Google 云原生的CICD - CloudBuild 已经介绍过, 用cloud build 去部署1个 spring boot service 到 cloud run 是很简单的, 因为部署cloud run 无非就是用gcloud 去部署1个 GAR 上的docker image 到cloud run 容…

墨雨云间王星越雨中情深

墨雨云间:王星越的雨中情深,吻上萧蘅,宿命之恋在烟雨朦胧的《墨雨云间》中,王星越饰演的角色,以其深邃的眼神和细腻的演技,将一段宿命之恋演绎得淋漓尽致。当镜头聚焦于他与阿狸在雨中的那一幕,…

Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。

文章目录 前言一、Django ORM介绍二、项目快速搭建三、操作1、view.pya、增加操作b、删除操作c、修改操作d、查询操作 2、urls.py 前言 上接博文:Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据…

暴雨推出基于英特尔® 至强® 6 能效核处理服务器

随着人工智能技术的快速发展,大模型的应用越来越广泛。据预测,到2024年年底,我国将有5%-8%的企业大模型参数从千亿级跃升至万亿级,算力需求增速将达到320%,这进一步推动了数据中心的持续变革。 超凡性能,绿…

STM32中ADC在cubemx基础配置界面介绍

ADCx的引脚,对应的不同I/O口,可以复用。 Temperature :温度传感器通道。 Vrefint :内部参照电压。 Conversion Trigger: 转换触发器。 IN0 至 IN15,是1ADC1的16个外部通道。本示例中输出连接的是ADC2的IN5通道,所以只勾选IN5.Temperature Sensor Cha…

百度/迅雷/夸克,网盘免费加速,已破!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 之前给大家安利了百度网盘及迅雷的加速方法,详细方法及获取参考之前文章: 刚刚!度盘、某雷已破!速度50M/s! 本次主要介绍夸…

单元测试之CppTest测试框架

目录 1 背景2 设计3 实现4 使用4.1 主函数4.2 测试用例4.2.1 定义4.2.2 实现 4.3 运行 1 背景 前面文章CppTest实战演示中讲述如何使用CppTest库。其主函数如下: int main(int argc, char *argv[]) {Test::Suite mainSuite;Test::TextOutput output(Test::TextOut…

在离线单机或内网环境中快速安装Visual Studio 2022并还原用户设定

20240606 By wdhuag 目录 前言 参考: 在外网环境下载离线安装包 1、在已安装好VS的电脑上用Visual Studio Installer导出配置.vsconfig 2、下载在线安装包VisualStudioSetup_Enterprise_2022.exe到D:\VisualStudio\ 3、使用cmd定位到VisualStudioSetup_Enter…

什么是 AOF 重写?AOF 重写机制的流程是什么?

引言:在Redis中,持久化是确保数据持久性和可恢复性的重要机制之一。除了常见的RDB(Redis Database)持久化方式外,AOF(Append Only File)也是一种常用的持久化方式。AOF持久化通过记录Redis服务器…

使用 Django 和 MQTT 构建实时数据传输应用

文章目录 什么是 MQTT?Django 中的 MQTT结论 在现代的 Web 应用程序开发中,实时数据传输变得越来越重要。MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,而 Django 是一个流行的 Pyt…

【Linux】进程5——进程优先级

1.进程优先级 1.1.什么是进程优先级 cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上&#x…