我与Go的故事以及我为什么推荐你学Go

在我写完上一篇《秋招经验贴》之后,有很多同学对其中提到的开源活动很感兴趣,随后我也出了一篇一站式攻略,带大家从零参加一个开源活动,收获一份开源项目经验+上万块钱,在不能实习的情况下获得一份有含金量的经历,简直爽的一批。这不,又有同学强烈建议我写一篇Go的入门教程,毕竟越来越火了,这不就来了!

回到我的大一

早在大一上学期学习 C/C++ 的基础语法时,我就在探索业界常用的其他编程语言。那时我经常喜欢独自去图书馆乱翻乱看,总觉得和那些在图书馆埋头学习的同学们格格不入,可能是我觉得来回的步伐声与身影难免有些聒噪与碍眼。

校图书馆有许多破旧到缺页泛黄的旧书,但是唯独计算机室的许多书崭新如初,似乎到图书馆的这段时间都没有人摸过,大家都不喜欢看似的,每次拿到总觉得我是第一手客户。


当时在图书馆借的书

我乐此不疲,总是乐于“白嫖”图书馆的各种新书,借来还去的,兜兜转转也经手了几十本,不知不觉也省下了几千块钱。

这么做一来是好奇图书馆有哪些计算机类的典藏书(黑皮书,CSAPP等),二来是想先随便翻翻,了解个大概,弄清楚例如是否值得我去学等等基础问题。

其实最开始我接触的并不是 Go,当时的 Go 在国内还没有现在应用的如此广泛,比较火的还是 PHP,图书馆里也有好几列到处都是名字类似「PHP+MySQL 开发 Web 系统」的新书。

我也借了好多本关于 PHP 的书,也关注了一些专注在 PHP 领域的博主,希望在学习知识的同时能多了解到一些前沿观点。

名字类似这本书

大概读了两章,讲的是诸如 PHP 的应用场景,基础语法等等的基础内容,总之对我当时学过的 C 系语言认知冲击很大......

恰巧当时朋友圈有一个专注 PHP 的技术博主发了一条圈,内容大概是「Web 领域除了 PHP,最近还有一门新兴语言 Go 也不错,推荐学习」,我就带着好奇去了解了这门语言。

我的故事就此开始了。

当我装好环境跑起来的时候,if 不能加括号、花括号强制不能另起一行、switch...case... 的判断条件更加灵活,少即是多、组合代替继承的,也许现在看来十分清晰的思想,在那时简直对还在纠结我的代码应该是 Google 风格还是 Microsoft 风格的我来说有一种莫名的吸引力。

// Google ~AsyncLogging() {
  if (running_) {
      stop();
  }
} // Microsoft ~AsyncLogging() 
{
  if (running_) 
  {
      stop();
  }
}

在那时市面上还没有这么多的 Go 国产书,大多都是出自国外大牛的启蒙著作,流入国内经过翻译的更少,由七牛云 CEO 许式伟带头翻译的黑皮书「Go语言程序设计」,算是其中的佼佼者。

早期为数不多的Go学习书

所以那段时间的学习十分的艰难,不像现在,很多圈内大佬都出了经典必读书、必读博客,例如曹大、左神(博客已出书)、煎鱼等等,入门起来十分方便,下文会详细再说。

慢慢的,我开始学习基础用法,进阶特性,底层原理,再后来,就是作为校招面试语言,拿到了一些公司 Go 后端开发的 SP/SSP Offer。

为什么推荐学Go

如果了解最近两年的校招,就会发现关于 Java 岗位的竞争异常激烈,如果你入门 Java 去找工作,基本上就是白给的 “炮灰”,各种底层原理分分钟就能把你 “卷死“。而 C++ 又以难学,繁琐著称,更是劝退。

不是有句话说得好嘛,「在 C++11 之后,就没有人精通 C++ 了」。

其实编程语言并不是校招面试的关键,所以我们为什么不选择一门不那么卷,发展前景还不错的语言呢?

Go 凭借着入门简单,语法精简,被各大公司青睐,相关岗位非常多,现在能叫得上名字的公司基本上都会有 Go 相关的岗位,所以这一点也不用担心。


一段标准库中的代码,解析某HTTP首部字段

如何学习Go

Go的书现在已经非常多了,有许多书围绕 Go 的基础使用大讲特讲,我认为性价比略低。

个人比较推荐讲解基础和底层原理类型的,因为 Go 入门相对简单,许多知识是隐藏在源码中的

入门篇

  1. Go by example

这是在线教程[1],每节都通过一个关键字或者数据结构,带你入门 Go 基础,每节都会有完整代码,右上角可以一键复制或者粘贴到官方 playground 运行,哪怕你学过很久后突然有一个地方忘记了,也可以来翻翻看,作为工具站点。

优点是基础、较全面,讲解细致,缺点是只有英文版本:(

某一节举例讲解闭包

  1. build-web-application-with-golang。

这是谢大(astaxie,beego作者)的开源项目[2],标题是用 Go 构建 Web 应用,甚至从 Go 的安装开始讲,已经有了十几种语言的译本。



部分目录

一个语言的入门无非就是学习整体结构,语法,标准库使用的过程,我认为上面两篇已经完全足够你来完成 Go 这门语言的入门了。

如果还有不懂的地方,可以加交流群一起交流~

进阶篇

  1. Go语言核心编程。

柴树杉&曹春晖两位资深大佬的书,深入浅出,非常经典。优点是 知识很全面,全书 着重从宏观上介绍 Go 语言,不拘泥于细节知识,建议有语言基础的人阅读。

它的在线阅读[3],大家可以先浏览一下再决定买不买。

  1. Go语言设计与实现。

左神、大左(头像德莱文,博客名「真没什么逻辑[4]」)的博客,现已出书,跟面试官对撕源码必读作,文章硬核,句句不离源码,客观,高质量。


深入源码讲解接口底层原理

  1. 幼麟实验室。

原创知识领域博主,知乎、公众号、B站均有账号,全网同名,通过动画讲解 Go 底层知识,我去年就是看这个跟面试官对撕每一行源码的,墙裂推荐。

图文语音讲解栈动态变化

  1. 极客兔兔。

个人总结类博客[5],有一组 7 天完成一个 mini 框架的开源学习项目,包括 Web 框架,RPC 框架,分布式缓存等等,从零开始、由浅入深,还有许多高质量分享。

另外博客框架经过魔改,所有 CSS 不到 10KB,秒开,也十分让我震惊。

7天从零开始教程部分目录

我之所以推荐多看进阶知识,是因为很多同学对知识的理解不深刻,往往只学习概念或者基础应用,面对校招面试官的追问很容易脑子一片空白。

比如我随便说几个基础的进阶问题,来看看你的理解是否达标:

  • map 这种数据结构是怎么实现任意 key-value 对的快速查找,而不是 O(N)?
  • HTTP 协议中,GET、POST、DELETE 等方法究竟有什么 本质区别
  • HTTPS 绝对安全吗?

如果你都能回答上来,那我初步认为你在学习的过程中是有深度思考的,否则平时可能还是专注在基础知识上了,需要转变一下视角。

有一个网站叫 Compiler Explorer[6],可以实时查看代码所对应的汇编代码,这样能从深层次审视你的代码效率,还能学习寄存器,各种指令,系统调用相关的,包含操作系统、组成原理在内的各种知识,这学习的 level 一下不就上去了。

支持多语言,保存加载,实时解析

其实像这样的工具有非常多,都能帮你从一个新的视角重新学习某个知识,拒绝死记硬背,”八股文“式的学法。

再比如说,当初我在学习分布式 Raft 协议的时候,也感觉细节繁多,难记,直到我遇到了这个动态演示网站[7]

按帧举例讲解Raft协议中各个过程,状态

类似的还有 Git 版本控制,TCP 流连接、传输过程等等,都是看起来很容易,实则细节非常多的知识,想拿到校招 Offer,需要你了解并知道基本应用,如果想拿到高评级 Offer,就需要用更细节的底层知识和面试官 battle 了。

我就不一一举例了,如果后续需要,我可以单独再出一期专门分享这些高效学习的站点。

算法篇

之所以将算法拿出来独占一节,也是受迫于近些年来校招对算法考核难度的逐步升级,而且极为重视。

十年前,能就冒泡排序的源码详聊也许就足够了,但是放在今天,或者说 23 届往后,各大公司裁员,缩减 HC 的大背景下,能经得起对快排的连续追问、手撕源码,都可能已经是最基本的“开胃小菜”了。

我并不是想制造焦虑,事实确实是这样,如果想要在校招大厂面试中以大多数 bug free 的成绩写出大多数题,没有比赛背景/300+ 道算法撑腰是很难的。

如果想练习算法,同时巩固 Go 语言基础,我建议是使用 Go 去刷一些算法题,在复杂的算法环境中完全适应 Go 语法和标准库。

这里推荐一个大佬的开源项目,他用 Go 写了 700+ 道 LeetCode 题解,每道题都 beat100%,还有各种算法模板,数据结构与算法讲解,如果你使用 Go 刷算法题,或者只是 Go 的初学者,这个资料用来学习十分不错。

部分目录截图

目前有电子书和在线观看地址[8],电子书我已经下载好了,在公众号回复「001」即可获取。

放在最后,实践

有了基础知识作为保障,我还是建议你实战一些落地项目,1-3 个为佳,在这个环节中,提升编码技能只是目的之一,更多的是练习在实战环境中遇到的各种场景的应对处理。比如说:

  • 如何处理海量的日志文件?快速查找,筛选,统计?

  • 如何排查系统运行中所出现的各种运行时异常?计算资源爆满/过度空闲,内存溢出/越界访问?

  • 如何防范各种来自黑客攻击的安全问题?

这些知识有一个共性,那就是在日常学习 “八股文” 的过程中不容易遇到,却能真真正正提高你 debug 的水平。

比如可以去学习一下 MIT6.824,尝试使用 Go 语言完成其中的几个 lab,以此来加深你对 Go 语言的理解,其中一些实验还是非常有意思的,例如第二个实验是实现一个 mini raft 协议,在我看过动态演示后难度就没有想象中那么大了。

总结一下

说了这么多,不仅是分享我在学习过程中所收藏的精彩资料,更是想向大家传达一个思想,有时候学习路并不是只有一条 ”康庄大道“ 式的走法,有时候你换一个思维,多方借鉴,也许能见识到一个完全不一样的计算机世界!

共勉。


参考资料

[1]Go by Example: https://gobyexample.com/
[2]谢大的开源项目: https://github.com/astaxie/build-web-application-with-golang
[3]Go语言核心编程在线阅读: https://chai2010.cn/advanced-go-programming-book/
[4]真没什么逻辑博客: https://draveness.me/golang/
[5]极客兔兔: https://geektutu.com/
[6]Compiler Explorer: https://gcc.godbolt.org/
[7]Raft动态演示: http://thesecretlivesofdata.com/raft/
[8]Go算法题解 : https://books.halfrost.com/leetcode/#Java找工作##2022春招#
全部评论
受教了
点赞 回复 分享
发布于 2022-06-23 19:20
受教了,感谢分享!
点赞 回复 分享
发布于 2022-06-28 15:56
受教了
1 回复 分享
发布于 2022-06-19 17:44
mark
1 回复 分享
发布于 2022-07-10 19:40
1 回复 分享
发布于 2022-08-16 10:00
谢谢
点赞 回复 分享
发布于 2022-09-06 23:39 陕西
mark
点赞 回复 分享
发布于 2022-10-17 08:41 广东
受教了,感谢
点赞 回复 分享
发布于 2023-05-19 13:55 山东
点赞 回复 分享
发布于 2023-05-22 00:41 山西
写的太好了,受益匪浅
点赞 回复 分享
发布于 07-27 01:23 浙江

相关推荐

98 400 评论
分享
牛客网
牛客企业服务