一本满是错误的Go语言书,凭什么1000万人都在读

news2024/11/16 2:57:04

犯错是每个人生活的一部分。正如爱因斯坦曾说过:一个从未犯过错的人从未尝试过新东西。

最重要的不是我们犯了多少错误,而是我们从错误中学到了多少东西。

这个观点同样适用于编程领域。

我们从一门编程语言中获取经验不是一个神奇的过程,它包含试错和从错误中学习的过程。

今天就和大家分享一本帮助我们从错误中学习编程语言的书——《100个Go语言典型错误》!

Image

本书的目的是通过观察和学习人们在使用 Go 的过程中经常犯的 100 个错误来帮助读者成为一个更熟练的 Go 开发者。

有些人认为 Go 是一门简单的语言。从某种意义上看,这的确不能说是错的。因为一个新手可能花不到一天的时间就能掌握这门语言的主要特性。如果 Go 很简单,为什么还要专门读一本以错误概念为中心的书呢?

01 简单不意味着容易

简单和容易之间还是有一些不同的。简单,在技术中意味着学习或理解起来不复杂。而容易意味着我们不需要花太大成本就可以完成任何事情。Go 语言学起来简单,但是掌握起来不容易。

以并发为例,在 2019 年,一篇专注于并发错误的论文发布了——“Understanding Real-World Concurrency Bugs in Go”。这篇论文是第一篇对并发错误进行系统研究的文章。

文章中研究了多个用 Go 编写的代码库,比如,Docker、gRPC 和 Kubernetes。这篇文章最主要的观点之一是,尽管人们认为消息传递比共享内存更容易处理,但绝大多数阻塞问题都是由于错误使用channel 造成的。

对于这样的结论你有什么反应呢?是否会认为语言设计者使用消息传递的方式是错误的呢?是否应该重新考虑在项目中如何处理并发问题呢?并不是。

这并不是要在消息传递和共享内存之间决定谁是更优解的问题。而是我们作为 Go 开发者,应该深入了解如何使用并发,现代处理器对并发的影响,什么时候应该使用何种并发方案及如何避免出错。举这个例子是想说,尽管 goroutine 和channel 的概念学起来比较简单,但是在实践中并不简单。

这个主旨——简单不意味着容易,不仅仅是说并发,还可以推广到 Go 语言的方方面面。

因此,想要成为一个 Go 语言开发高手,我们需要花费时间、努力,通过从错误中学习来对这门语言的各个方面做深入了解。 

本书的目标是通过深入研究 100 个 Go 语言错误来帮助读者加速掌握 Go 语言。

02 100 个 Go 语言错误

我们为什么需要读一本研究常见Go错误的书呢?为什么不通过一本普通研究Go中不同主题的书来加深我们对 Go 的理解呢? 

在 2011 年的一篇研究文章中,神经科学家表明,大脑成长的最佳时间是在面对错误的时候。你经历过从错误中进行学习,在几个月甚至几年后遇到相似的场景时又回忆起当初的错误这样的事情吗?正如 Janet Metcalfe 在另一篇文章中介绍的那样:发生这种情况是因为错误有促进作用。主要是因为我们不仅可以记住错误,还可以记住错误发生的场景。这就是为什么从错误中学习如此高效的原因之一。

为了加强这种促进作用,本书尽可能地在每个错误中都加入示例。本书不仅会介绍理论,还会帮助大家更好地避免犯错。在明白了错误背后的原理之后会帮助大家做出更多明智的、深思熟虑的决定。

告诉我,我会忘记;教给我,我会记得;让我参与进去,我能学会。

——无名氏

本书列出了七种主要的错误,总体来说,错误包括:

  • bug

  • 不必要的复杂性

  • 可读性差

  • 非最佳组织形式

  • API 对用户不友好

  • 代码有待优化

  • 效率低

我们会在后面的内容中依次介绍这些错误。

bug

第一种错误是最明显的软件 bug。2020 年,Synopsys 进行的一项研究表明,仅在美国,由于软件 bug 造成的损失就超过 2 万亿美元。

此外,bug 还可能酿成惨剧。比如,加拿大原子能有限公司(AECL)生产的放射治疗机Therac-25,由于竞态条件,机器给患者的辐射剂量比预期的高出百倍,导致三名患者死亡。

因此,软件 bug 不仅仅和钱相关。作为开发者,我们应该记住自己的工作是多么有影响力。

本书涵盖了大量会导致软件 bug 的情况,包括:数据竞争、泄漏、逻辑错误和其他缺陷。

尽管准确的测试是尽早发现这些 bug 的一种方法,但由于时间限制和复杂性等因素,我们有时候可能来不及写测试用例。因此,作为一个 Go 开发者,避免这些常见的错误是非常有必要的。

▎不必要的复杂性

下一种错误是不必要的复杂性。软件复杂性的一个重要来源基于这样一个事实:作为开发人员,我们会努力想象未来会增加什么特性——与其立即解决具体的问题,不如构建出能解决未来出现任何特性的设计。然而,这在大多数情况下弊大于利,因为这样会使代码库变得更加复杂、难以理解和推理。

回到 Go 语言,我们可以想到大量的例子:开发人员想要对未来的需求做抽象,使用接口或泛型。本书会讨论应该避免引入不必要的复杂性来破坏代码库的主题。

▎可读性差

另一种错误是可读性差。正如 Robert C. Martin 在他的书《代码整洁之道》中所写的那样:代码的阅读和编写的时间比例超过 10∶1.5。①我们大多数人都是在可读性不那么重要的独立项目中开始编程的。然而,现代程序员都是在具有时间维度的情况下进行编程的:要确保在几个月、几年甚至几十年后仍然可以使用和维护一个应用程序。

在用 Go 编程时,我们可能会犯很多影响可读性的错误。这些错误包括:代码嵌套、数据类型表示、某些情况下不使用命名的结果参数。通过本书,我们将学习为了读者(也包括未来的我们自己),如何写出可读性强的代码。

▎非最佳组织形式

无论是在新项目中,还是由于我们采取了不准确的方式,造成另一种错误使项目和代码不是最佳解法。这样的问题会让一个项目难以理解和维护。本书涵盖了 Go 中这类常见的错误。比如,我们将学习如何组织一个项目及如何处理公共函数包或初始化函数。总之,学习这些错误会帮助我们更高效地组织 Go 项目。

▎API 对用户不友好

另一种常见的错误是降低了 API 对客户端的便利性。如果一个 API 对用户不友好,那么它的表达能力就会降低,从而变得难以理解,也就容易使人犯错。

我们可以想到很多情况,比如过度使用 any 类型、使用错误的创建模式来处理可选项,或者盲目使用面向对象编程的标准实践,这些都会影响 API 的可用性。本书涵盖了阻碍我们给用户提供方便的 API 的常见错误。

▎代码有待优化

代码优化不足是开发者常犯的另一类错误。导致其发生的原因有很多,比如不了解语言特性,甚至是缺乏对语言的基本认知。性能是这种错误最明显的影响之一,但这种错误不仅仅是影响性能。

我们可以考虑为一些目标优化代码,如准确性。本书会提供一些常见的技术来确保浮点数计算的准确性,同时会涵盖大量的用例来说明代码优化不足造成的性能影响,比如并发度不够,不知道如何减少分配,或者数据对齐造成的影响。我们会通过不同的场景来解决待优化问题。

▎效率低

在大多数情况下,当我们在一个新项目上开发时,什么是最优的语言?最优的语言是使工作效率最高的语言。熟悉一门语言的工作方式并利用它达到最佳效果是提高效率的关键。

在本书中,我们会涉及很多场景和具体的例子来帮助我们在使用 Go 语言开发时提高工作效率。比如,我们会研究如何编写高效的测试来保证代码能正确运行,如何依赖标准库提高效率,如何充分利用分析工具和辅助工具。现在,是时候深入研究这 100 个常见的 Go 错误了。

Image

Go 语言是一门现代编程语言,能提高开发者的工作效率,这对当今大多数公司而言是至关重要的。

Go 语言入门容易但精通难。这就是我们为什么需要深化对 Go 语言的认知,以便最有效地使用这门语言。

通过错误和具体例子进行学习是熟练掌握一门语言的有效方法。本书通过探讨 100 个常见的错误来加速我们对 Go 语言的掌握。

↑限时五折优惠↑

Image

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

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

相关文章

Rocky Linux 8.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任,图解仅供参考,请悉知!本次安装图解是在一个全新的演示环境下进行的,演示环境中没有任何有价值的数据,但这并不代表摆在你面前的环境也是如此。生产环境…

【大数据处理技术实践】期末考查题目:集群搭建、合并文件与数据统计可视化

集群搭建、合并文件与数据统计可视化 实验目的任务一:任务二: 实验平台实验内容及步骤任务一:搭建具有3个DataNode节点的HDFS集群集群环境配置克隆的方式创建 Slave 节点修改主机名编辑 hosts 文件生成密钥免认证登录修改 hadoop 的配置文件编…

CentOS 7 安装配置MySQL

目录 一、安装MySQL​编辑​编辑 1、检查MySQL是否安装及版本信息​编辑 2、卸载 2.1 rpm格式安装的mysql卸载方式 2.2 二进制包格式安装的mysql卸载 3、安装 二、配置MySQL 1、修改MySQL临时密码 2、允许远程访问 2.1 修改MySQL允许任何人连接 2.2 防火墙的问题 2…

Linux操作系统IPC之—SYSTEM V共享内存

文章目录 共享内存的简介共享内存示意图 共享内存数据结构共享内存用到的函数具体的代码最终运行图 共享内存的简介 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过…

请你来了解一下Mysql-InnoDB中事务的两段式提交

欢迎订阅专栏,了解更多Mysql的硬核知识点,原创不易,求打赏 ACID:事务的四个特性 A:原子性 原子性表示把一个事务中所有的操作视为一个整体,要么全部成功,要么全部失败,是事务模型区…

《WebKit 技术内幕》学习之七(3): 渲染基础

3 渲染方式 3.1 绘图上下文(GraphicsContext) 上面介绍了WebKit的内部表示结构,RenderObject对象知道如何绘制自己,但是,问题是RenderObject对象用什么来绘制内容呢?在WebKit中,绘图操作被定…

2024.1.22(150. 逆波兰表达式求值)

2024.1.22(150. 逆波兰表达式求值) 相信看完动画大家应该知道,这和1047. 删除字符串中的所有相邻重复项是差不错的,只不过本题不要相邻元素做消除了,而是做运算! // 定义一个Solution类 class Solution { // 定义一个公共方法…

GoZero微服务个人探究之路(八)-[mysql数据库]如何拓展由goctl生成的model代码里的方法

前言 goctl生成的方法只有四个: insert,update,findone,delete, 事实上很多时候这是不够用的,同时生成的这四个方法也很简单,业务逻辑一复杂就做不了了,需要我们自己去实现自己想…

esp32-idf eclipse 分区表(partition table / NVS)的读写demo

前言: 分区表(Partition Table)和 NVS(Non-Volatile Storage)是 ESP-IDF 中用于存储数据的两种不同机制。 分区表(Partition Table): 分区表定义了将 Flash 存储器划分为不同逻辑分…

Hugo使用且部署GitHubPages

hugo的使用 20201121 Hugo是由Go语言实现的静态网站生成器。简单、易用、高效、易扩展、快速部署。 安装Hugo 0.windows安装(releases) 下载地址:https://github.com/spf13/hugo/releases。 配置环境变量 验证测试是否安装成功 hugo help1. 二进制安装&#xf…

提升认知,推荐15个面向开发者的中文播客

前言 对于科技从业者而言,无论是自学成才的程序员,还是行业资深人士,终身学习是很有必要的,尤其是在这样一个技术快速迭代更新的时代。 作为一个摆脱了时间和空间限制的资讯分享平台,播客(Podcast&#x…

【算法练习Day51】柱状图中最大的矩形

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 柱状图中最大的矩形思路动态…

Android学习之路(22) 从模块化到组件化

从模块化到组件化 一、从模块化到组件化 Android 应用项目 , 都存在一个应用模块 ( Application Module ) , 在 build.gradle 构建脚本中 , 第一个插件配置 com.android.application , 表明 该 Module 编译打包后的输出是 APK 安装包 ; 该项目可以直接运行 ; plugins {id co…

第14章_集合与数据结构拓展练习(前序、中序、后序遍历,线性结构,单向链表构建,单向链表及其反转,字符串压缩)

文章目录 第14章_集合与数据结构拓展练习选择填空题1、前序、中序、后序遍历2、线性结构3、其它 编程题4、单向链表构建5、单向链表及其反转6、字符串压缩 第14章_集合与数据结构拓展练习 选择填空题 1、前序、中序、后序遍历 分析: 完全二叉树: 叶结点…

灰度图像的自动阈值分割

第一种:Otsu (大津法) 一、基于cv2的API调用 1、代码实现 直接给出相关代码: import cv2 import matplotlib.pylab as pltpath r"D:\Desktop\00aa\1.png" img cv2.imread(path, 0)def main2():ret, thresh1 cv2.…

赢领时代,蓝带启航,蓝带啤酒2024年会圆满成功,共绘宏伟蓝图

2024年1月14日,泰国普吉岛,由蓝带啤酒股份公司主办的“涅槃新蓝带、赢领新未来”2024年核心团队年会在普吉岛艾美海滩度假酒店盛大举行,来自全国各地的蓝带营销菁英、核心团队以及合伙人等九十多位代表汇聚一堂,共同见证并分享公司…

[python题解13】只出现一个数字。给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

1. 题目:只出现一个数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 输入样例: [2,2,1] 输出样例: 1 2. 使用set去重然后相减即可得到答案;使用异或也可 3. 源…

Next-GPT: Any-to-Any Multimodal LLM

Next-GPT: Any-to-Any Multimodal LLM 最近在调研一些多模态大模型相关的论文,发现Arxiv上出的论文根本看不过来,遂决定开辟一个新坑《一页PPT说清一篇论文》。自己在读论文的过程中会用一页PPT梳理其脉络和重点信息,旨在帮助自己和读者快速了…

python批量复制图片到execl并指定图片的大小

工作需要需要复制批量图片到execl,并指定大小,这里简单实现一下,使用xlwings库来实现总体来说是比较简单的,这里简单记录一下 import xlwings as xw import os# 创建一个可见的Excel应用程序对象 app xw.App(visibleTrue)# 打开…

【webrtc】neteq测试工程

设置git代理 $ git config --global http.https://github.com.proxy socks5://127.0.0.1:7890 git config --global https.https://github.com.proxy socks5://127.0.0.1:7890导入cmake直接构建 win32 debug v143 编译opus Build started...