Go 中的 7 个常见接口错误

news2025/2/11 9:30:25

Go 仍然是一门新语言,如果你正在使用它,它很可能不是你的第一门编程语言。

不同的语言,既为你带来了经验,也带来了偏见。你用以前的任何语言做的事情,在 Go 中用相同的方法可能不是一个好主意。

学习 Go 不仅仅是学习一种新的语法。这也是学习一种新的思维方式来思考你的程序:

Go is a language for writing Go programs, not Java programs or Haskell programs or any other language’s programs. You need to think a different way to write good Go programs. But that takes time and effort, more than most will invest. So the usual story is to translate one program from another language into Go and see how it turns out. But translation misses idiom. A first attempt to write, for example, some Java construct in Go will likely fail, while a different Go-specific approach might succeed and illuminate. After 10 years of Java programming and 10 minutes of Go programming, any comparison of the language’s capabilities is unlikely to generate insight, yet here come the results, because that’s a modern programmer’s job.

Rob Pike Esmerelda’s Imagination

正如 Rob Pike 所建议的那样,如果你想提高围棋技能,需要投入时间和精力来学习这门语言的习语。

Go 在几件事上与其他传统语言不同,在本文中,我将重点介绍其中之一:接口。

下面列出了人们在编写 Go 接口时常犯的错误。这些在其他语言中可能不是错误,但在 Go 中,你需要忘记它们。或者至少,给一个机会,暂时不和他们一起工作,看看这会把你引向何方。

但在这之前

以下是阅读本文时要记住的事项列表。如果你已经熟悉它们,请随意跳过。

  • 接口隔离原则:不应强制客户端实现它不使用的接口,也不应强制客户端依赖于它们不使用的方法。

  • 多态性:一段代码根据它收到的具体数据改变其行为。

  • Liskov 替换原则:如果你的代码依赖于抽象,那么一个实现可以被另一个实现替换,而无需更改你的代码。

    抽象的目的不是模糊不清,而是创造一个新的语义层次,在这个层次上可以绝对精确。— E.W.迪克斯特拉

接口是精确包含用于编写程序的想法的概念。

以正确的方式使用接口可以带来简单性、可读性和 organic code 设计。

organic code 是代码会根据你在某个时间点所需的行为而增长。它不会强迫你提前考虑你的类型以及它们之间的关系,因为你很可能无法正确理解它们。

这就是为什么说 Go 偏爱组合而不是继承。你有一小组行为,你可以从中编写任何你想要的,而不是预定义由其他类型继承的类型并希望它们适合问题域。

Rob Pike 在 golang-nuts 论坛上解释了这种方法:

img

Go 的接口不是 Java 或 C# 接口的变体,它们远不止于此。它们是大规模编程和适应性强的演进设计的关键。

无论如何,理论已经足够了,让我们来看看最常见的错误:

1. 你创建了太多的接口

接口过多的术语称为接口污染 interface pollution.。当你在编写具体类型之前开始抽象时,就会发生这种情况。由于你无法预见你需要什么抽象,所以很容易写出太多的接口,这些接口在以后要么是错误的,要么是无用的。

Rob Pike 有一个很好的指南,可以帮助我们避免界面污染:

Don’t design with interfaces, discover them.

Rob Pike

Rob 在这里指出的是,你不需要提前考虑你需要什么抽象。你可以使用具体结构开始设计,并仅在设计需要时创建接口。通过这样做,你的代码会顺其自然的增长到预期的设计。

我仍然看到人们提前创建接口,因为他们认为他们将来可能需要多个实现。

我对他们说:

img

以一种好的方式懒惰。创建接口的最佳时机是你真正需要它的时候,而不是你预测需要它的时候。下面是一个通过提前思考创建接口的示例,以及它导致了什么。

无用的接口往往只有一个实现。它们只是增加了一个额外的间接级别,迫使程序员在真正想要实现时总是通过它们。

接口是有代价的:这是您在推理代码时需要记住的一个新概念。正如 Djikstra 所说,理想的界面必须是“a new semantic level in which one can be absolutely precise.”。

如果你的代码需要 Box 的概念,仅由 Box 实现的名为 Container 的额外接口没有带来任何好处,除了混淆。

因此,在创建接口之前,先问问自己:接口有多个实现吗?我强调使用了‘有’,因为‘将会有’假设了你能预测未来,而你不能。

2. 你有太多的方法

在 PHP 项目中,看到 10 种方法接口是很常见的。在 Go 中,接口很小,标准库中所有接口上的平均方法数为 2。

The bigger the interface the weaker the abstraction,这是 Go 谚语之一。正如 Rob Pike 所说,这是接口最重要的一点,这意味着接口越小,它就越有用。

接口可以拥有的实现越多,它的通用性就越强。如果你有一个包含大量方法的接口,则很难有它的多个实现。您拥有的方法越多,接口就越具体。它越具体,不同类型显示相同行为的可能性就越低。

有用接口的一个很好的例子是

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

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

相关文章

LLAMA-Factory安装教程(解决报错cannot allocate memory in static TLS block的问题)

步骤一: 下载基础镜像 # 配置docker DNS vi /etc/docker/daemon.json # daemon.json文件中 { "insecure-registries": ["https://swr.cn-east-317.qdrgznjszx.com"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.c…

二级C语言题解:十进制转其他进制、非素数求和、重复数统计

目录 一、程序填空📝 --- 十进制转其他进制 题目📃 分析🧐 二、程序修改🛠️ --- 非素数求和 题目📃 分析🧐 三、程序设计💻 --- 重复数统计 题目📃 分析🧐 前言…

Unity3D引擎首次用于光伏仿真设计软件爆火

在光伏设计领域,绿虫光伏仿真设计软件宛如一匹黑马,凭借其基于 Unity3D 引擎的强大功能,为行业带来了全新的解决方案。借助 Unity3D 引擎技术,实现了游戏级高清画面,2D/3D 自由转换,让场景代入感极强&#…

基础入门-网站协议身份鉴权OAuth2安全Token令牌JWT值Authirization标头

知识点: 1、网站协议-http/https安全差异(抓包) 2、身份鉴权-HTTP头&OAuth2&JWT&Token 一、演示案例-网站协议-http&https-安全测试差异性 1、加密方式 HTTP:使用明文传输,数据在传输过程中可以被…

深入理解 C++17 std::is_swappable

文章目录 深入理解 C17 std::is_swappable引言std::is_swappable 概述std::is_swappable 的工作原理std::is_swappable 的变体注意事项结论 深入理解 C17 std::is_swappable 引言 在 C 编程中,交换两个对象的值是一个常见的操作。为了确保代码的通用性和安全性&am…

Vue(4)

一.组件的三大组成部分-注意点说明 (1)scoped样式冲突 默认情况:写在组件中的样式会全局生效 → 因此很容易造成多个组件之间的样式冲突 ①全局样式:默认组件中的样式会作用到全局 ②局部样式:可以给组件加上scoped属…

4G核心网的演变与创新:从传统到虚拟化的跨越

4G核心网 随着移动通信技术的不断发展,4G核心网已经经历了从传统的硬件密集型架构到现代化、虚拟化网络架构的重大转型。这一演变不仅提升了网络的灵活性和可扩展性,也为未来的5G、物联网(LOT)和边缘计算等技术的发展奠定了基础。…

探讨如何在AS上构建webrtc(2)从sdk/android/Build.gn开始

全文七千多字,示例代码居多别担心,没有废话,不建议跳读。 零、梦开始的地方 要发美梦得先入睡,要入睡得找能躺平的地方。那么能躺平编译webrtc-android的地方在哪?在./src/sdk/android/Build.gn。Build.gn是Build.nin…

C#常用集合优缺点对比

先上结论&#xff1a; 在C#中&#xff0c;链表、一维数组、字典、List<T>和ArrayList是常见的数据集合类型&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。以下是它们的比较&#xff1a; 1. 一维数组 (T[]) 优点&#xff1a; 性能高&#xff1a;数组在内存中…

多线程下jdk1.7的头插法导致的死循环问题

20250208 多线程下jdk1.7的头插法导致的死循环问题 多线程下jdk1.7的头插法导致的死循环问题 【新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频面试真题&#xff09;】 jdk1.7在hashmap扩容时使用的是头插法&#xff0c;所以扩容…

MySQL的深度分页如何优化?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL的深度分页如何优化?】面试题。希望对大家有帮助&#xff1b; MySQL的深度分页如何优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL在处理深度分页&#xff08;即查询页数较大时&#xff0c;通常是查询…

uniapp中使用uCharts折线图X轴数据间隔显示

1、先看官网 https://www.ucharts.cn/ 2、设置代码 "xAxisDemo3":function(val, index, opts){if(index % 2 0){return val}else {return }}, 再在数据中引入设置好样式

公司配置内网穿透方法笔记

一、目的 公司内部有局域网&#xff0c;局域网上有ftp服务器&#xff0c;有windows桌面服务器&#xff1b; 在内网环境下&#xff0c;是可以访问ftp服务器以及用远程桌面登录windows桌面服务器的&#xff1b; 现在想居家办公时&#xff0c;也能访问到公司内网的ftp服务器和win…

【Windows/C++/yolo开发部署02:正确方法】将自定义实例分割模型导出为 ONNX 格式

【完整项目下载地址】: 【TensorRT部署YOLO项目:实例分割+目标检测】+【C++和python两种方式】+【支持linux和windows】资源-CSDN文库 目录 写在前面 环境准备 安装必要的库 下载模型并开始转换 解决依赖问题 安装 ONNX 降级 Protobuf 最终转换 总结 写在前面 在…

国产编辑器EverEdit - 编辑辅助功能介绍

1 编辑辅助功能 1.1 各编辑辅助选项说明 1.1.1 行号 打开该选项时&#xff0c;在编辑器主窗口左侧显示行号&#xff0c;如下图所示&#xff1a; 1.1.2 文档地图 打开该选项时&#xff0c;在编辑器主窗口右侧靠近垂直滚动条的地方显示代码的缩略图&#xff0c;如下图所示&…

Jupyter Notebook自动保存失败等问题的解决

一、未生成配置文件 需要在命令行中&#xff0c;执行下面的命令自动生成配置文件 jupyter notebook --generate-config 执行后会在 C:\Users\用户名\.jupyter目录中生成文件 jupyter_notebook_config.py 二、在网页端打开Jupyter Notebook后文件保存失败&#xff1b;运行代码…

Shapefile格式文件解析和显示

Java实现GIS SHP文件格式的解析和显示&#xff0c;JDK19下编译&#xff0c;awt图形系统显示。 SHP文件对应的属性存储在DBF格式数据库中&#xff0c;解析见&#xff1a;DBASE DBF数据库文件解析_数据库文件在线解析-CSDN博客 解析SHP文件代码&#xff1a; public static Shap…

大语言模型需要的可观测性数据的关联方式

可观测性数据的关联方式及其优缺点 随着现代分布式架构和微服务的普及&#xff0c;可观测性&#xff08;Observability&#xff09;已经成为确保系统健康、排查故障、优化性能的重要组成部分。有效的可观测性数据关联方式不仅能够帮助我们实时监控系统的运行状态&#xff0c;还…

wordpressAI工具,已接入Deepseek 支持自动生成文章、生成图片、生成长尾关键词、前端AI窗口互动、批量采集等

基于关键词或现有内容生成SEO优化的文章&#xff0c;支持多种AI服务&#xff08;如OpenAI、百度文心一言、智谱AI等&#xff09;&#xff0c;并提供定时任务、内容采集、关键词生成等功能。 核心功能 文章生成 关键词生成&#xff1a;根据输入的关键词生成高质量文章。 内容…

mysql8安装时提示-缺少Microsoft Visual C++ 2019 x64 redistributable

MySQL8.0安装包mysql-8.0.1-winx64进行安装&#xff0c;提示&#xff1a;This application requires Visual Studio 2019 x64Redistributable, Please install the Redistributable then runthis installer again。出现这个错误是因为我们电脑缺少Microsoft Visual C 这个程序&…