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

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

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

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

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

今天就和大家分享一本帮助我们从错误中学习编程语言的书——《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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rocky Linux 9. 3安装图解

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

2024.1.19 网络编程 作业

思维导图 练习题 1> UDP传输实现聊天室 服务器端 #include <myhead.h> #define SER_IP "192.168.125.151" #define SER_PORT 9999 typedef struct Msg {char user[32]; //用户名int type; //执行操作1.登录、2.发消息、0.退出char text[1024]; …

NOC总线(1)

1. 背景 SoC &#xff08;system on chip,片上系统&#xff09;通常指在单一芯片上实现的数字计算机系统&#xff0c;总线结构是该系统的主要特征&#xff0c;由于其可以提供高性能的互连而被广泛运用。随着单芯片上集成的处理器核数越来越多&#xff0c;片上互连架构经历了从专…

sqlmap使用教程(2)-连接目标

目录 连接目标 1.1 设置认证信息 1.2 配置代理 1.3 Tor匿名网络 1.4 检测WAF/IPS 1.5 调整连接选项 1.6 处理连接错误 连接目标 场景1&#xff1a;通过代理网络上网&#xff0c;需要进行相应配置才可以成功访问目标主机 场景2&#xff1a;目标网站需要进行身份认证后才…

【git分支管理策略】

文章目录 前言一、分支管理策略简介二、git基本操作三、git分支远程分支本地分支 四、gitflow分支管理策略分支定义gitflow分支管理策略评价 五、GITHUB FLOW分支管理策略分支使用流程创建分支&#xff08;Create a branch&#xff09;新增提交(add and commit)提出 Pull 请求&…

关联系统-智能座舱控制器ICC

智能座舱构成 如上图所示&#xff0c;智能座舱主要是由仪表、中控、HUD、语音、DMS/OMS等多种交互通道组成&#xff0c;其宗旨是提升人的交互体验&#xff0c;使车辆更加智能化&#xff0c;情感化。 智能座舱内部功能 仪表功能 SR场景重构 如上图所示&#xff0c;仪表区域可实…

k8s的包管理工具helm

Helm是什么? 之前的这篇文章介绍了一开始接触k8s的时候接触到的几个命令工具 kubectl&kubelet&rancher&helm&kubeadm这几个命令行工具是什么关系&#xff1f;-CSDN博客 Helm 是一个用于管理和部署 Kubernetes 应用程序的包管理工具。它允许用户定义、安装和…

Linux软件包管理器yum

文章目录 前言概述Linux下载软件的三种方式源代码安装rpm安装yum安装 关于yum的相关操作查看软件包软件安装卸载软件 yum源问题 前言 在Windows系统中&#xff0c;如果我们要去下载软件&#xff0c;我们可以在该软件的官网中进行下载&#xff0c;或者在微软的额软件商店进行下…

设计亚马逊按销售排名功能

1&#xff1a; 定义 Use Cases 和 约束 Use cases 作用域内的Use Case Service 通过目录计算过去一周内最受欢迎的产品User 通过目录去View过去周内最受欢迎的产品Service 有高可用 作用域外 整个电商网站 设计组件&#xff08;只是计算销售排名&#xff09; 约束和假设…

经典面试题-死锁

目录 1.什么是死锁&#xff1f; 2.形成死锁的四个必要条件 3.死锁的三种情况 第一种情况&#xff1a; 举例&#xff1a; 举例&#xff1a; 第二种情况&#xff1a;两个线程 两把锁 举例&#xff1a; 第三种情况&#xff1a;N个线程 M把锁 哲学家进餐问题 1.什么是死锁&…

java黑马学习笔记

数组 变量存在栈中&#xff0c;变量值存放在堆中。 数组反转 public class test{public static void main(String[] args){//目标&#xff1a;完成数组反转int[] arr {10,20,30,40,50};for (int i 0,j arr.length - 1;i < j;i,j--){int tep arr[j]; //后一个值赋给临时…

【Linux】解决普通用户无法进行sudo提权

当某个普通用户进行sudo指令提权的时候&#xff0c;可能存在无法操作的问题&#xff0c;如下图&#xff1a; 这个图中有一个细节&#xff0c;我们使用sudo进行提权的时候&#xff0c;用的可是zhangsan的密码&#xff0c;因此有人可能会有疑问&#xff0c;这不是有问题吗&#x…

爬虫-selenium自动化(3)-验证码

#验证码分很多种&#xff0c;奇葩也无处不在:哪个是真茅台&#xff0c;红绿灯&#xff0c;摩托车......(我是个人都看不出来) (๑﹏๑) #本节内容为selenium自动化实现验证码通过-------字符验证码&#xff0c;点触验证码。 验证码介绍 字符验证码案例 点触验证码案例

如何在WordPress网站中添加多语言搜索(2种简单方法)

您想在WordPress网站中添加多语言搜索吗&#xff1f; 如果您有一个多语言 WordPress 网站&#xff0c;那么添加多语言搜索功能可以帮助用户通过使用自己的语言进行搜索来更快地找到信息。 在本文中&#xff0c;我们将向您展示如何在 WordPress 中轻松添加多语言搜索&#xff…

Springboot常见报错及解决方案

1、多模块项目无法启动&#xff0c;报错Failed to execute goal on project*: Could not resolve dependencies for project 2、报错找不到符号&#xff08;在多moudle调用的时候&#xff0c;公共模块新增了东西的时候发生&#xff09; Rebuild项目 3、切换分支一开始跑不了的…

PowerShell install 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

解决ssh登录Permission denied, please try again

现象截图如下&#xff1a; 确定root的密码是正确的&#xff0c;最后的原因找到了&#xff0c;是远程的服务器&#xff0c;禁用了root账户可以被远程访问的权限。开启操作如下&#xff1a; 1.编辑配置文件 vi /etc/ssh/sshd_config 2.文件中找到PermitRootLogin #PermitRoo…

静态路由实验

一&#xff1a;实验内容 二&#xff1a;实验分析 &#xff08;一&#xff09;&#xff1a;实验要求 1、R6为ISP&#xff0c;接口IP地址均为公有地址&#xff1b;该设备只能配置IP地址&#xff0c;之后不能再对其进行其他任何配置&#xff1b; 2、R1-R5为局域网&#xff0c…

鸿蒙开发(七)添加常用控件(上)

相信大家已经对鸿蒙开发的布局有了基本的了解。之前我们提到过&#xff0c;一个好的UI&#xff0c;离不开选择合理的布局。当然&#xff0c;也离不开适当的控件。本篇文章&#xff0c;带着大家一起学习下如何在页面里面添加常用的控件。由于控件较多&#xff0c;我会分为两篇文…

HarmonyOS SDK,助力开发者打造焕然一新的鸿蒙原生应用

鸿蒙生态千帆启航仪式于1月18日正式启动。从2019年HarmonyOS正式发布到2020年“没有人能够熄灭漫天星光”&#xff0c;今天&#xff0c;满天星光终汇成璀璨星河&#xff0c;HarmonyOS NEXT鸿蒙星河版重磅发布&#xff0c;带来了全新架构、全新体验、全新生态。作为支撑鸿蒙原生…