Go后端学习路线来了

Go 学习路线拖了好久了,主要是 Go 不像 Java,有着丰富的学习资料 + 过来人的各种踩坑,Go 的话,网上的学习资料比较零散,而且很多还是培训机构的,罗列一大堆知识,可能初学者看了和没看一样。

不过嘛,既然要写,很多东西就得调研清楚,我先说下,我写的这个学习路线,基于校招版的哦,其实在校招中,语言的占比不大,所以一般我们深入去掌握一门语言就可以了,既然选择了 Go,那也得去掌握下 Go 的语言特性。

下面我先关于 Go 的就业岗位以及校招面试做一些问答。

Go 的岗位多嘛

Go 可以说是最近两年比较火的语言,虽然说比较火,但是岗位数量还是和 Java/C++ 没得比,当然,走 Go 的人也会少一些,至于 Java/C++ 和 Go 的就业比例,说实话,这个不好统计,我也不清楚。

只能说,Go 在大公司可能会多一点。

因为 Go 用在云原生啊,容器虚拟化,分布式存储啥的啊,可能会多一些,这这块,一般小公司做的比较少。

另外,如果很多公司之前用的架构不是 Go,你让它重新整理架构,这是一个大工程,并且 Go 的组件没有 Java 这些丰富,所以在很多公司中,Java 依然是主流,Go 在大厂中可能会多一些。

所以我觉得,大家在选择 Go/C++/Java 的时候,最好不要以岗位多不多来选择,如果是基于兴趣是最好的吧,并且在校招中,语言不是重点。

另外,目前我知道的,用 Go 最多的公司就是 字节跳动B站了。

就业前景

这里我强调一下,不用关心就业前景;不用关心就业前景;不用关心就业前景…

前端,Go/Java/C++,这些都是目前需求量相对比较大且比较主流的岗位,只要你学好,那都可以很香,不用关心天花板这些问题,没啥用,你能走到天花板,那就是牛人了。

当然,如果你说你要走 PHP,net 这些,那我就真的不大建议,倒不是找不到工作,而是选择面会窄,并且一般公司会找有几年开发经验的人。

下面开始学学习路线

一、学 Go 之前

我觉得你学习 Go 之前应该也学过其他语言吧?如果你有学过面向对象的语言,再来学 Go,可能可以对 Go 理解的更加深刻。

我之前学过一阵子 Go,学起来还是不难,就是容易把一些语法忘了,所以在学的时候,我希望大家可以前期多做一些练习,主要就是属于语法的使用。

如果你是 0 基础的,有些学起来还是有点小难度,不过也问题不大,多看几遍就好了。

二、Go 入门

说实话,入门这块,没啥好说的,学习任何一门语言都一样,随便找个简易的教程,跟着学就行了,知识点也没啥强调的,反正都得掌握。

一般就是这几个:

1、函数:Go 的函数,还是和 Java 啥的有一点点不一样。

2、指针

3、结构体

4、面向对象的知识以及它的特性(注意和Java/C++的一些区别)

5、IO处理

5、还有一个非常重要的 goroutine 和 channel 这两个。

如果你喜欢看视频,可以在 B 站 或者木刻网找个播放量高的视频就行,这里我就不推荐了。

咱们星期也有个 Go 的课程,里面还附带了项目,不过不适合 0 基础的同学,适合已经学过面向对象这些知识的同学,链接看这里:

如果你喜欢看文字,那么可以在菜鸟教程这里找,快速入门还挺不错:Go 语言入门

另外就是关于 Go 的书籍,目前有一本用的人比较多的是《Go程序设计语言》,这本书我看过一部分,个人觉得不适合 0 基础的初学者哈,我还是建议大家入门就找个视频或者找个简易的教程,后面入门之后,再来看这些书。

三、Go web + 网络编程

学完 Go 入门,可以学一学 Go web 开发,看看 Go 都能干些啥,不过学习 Go web 开发之前,最好是有一点前端基础,比如简单看过 html + js + css,这样在学习 Go web 的时候,会容易一些。

Go web 的话,主要就是学习下网络编程,看看 Go 是怎么进行交互的,比如你可以用 Go 做一些小项目,比如 RPC,或者通过 Go web,学习它和 Mysql, redis 这些怎么整合。

关于 Go web 的书籍:《Go web 开发》,这本书不厚,可以跟着里面写一写例子。

另外就是关于 Go 框架的,Go 的框架不算多,不过我觉得你可以基于项目来学一些框架,比如你要做个 xxx 的项目,你一般是跟着教程做的,那么看看这个教程用的啥框架,那么就去跟着学。

一般 Go Web主流的框架有 Iris,Beego, Gin 这几个

四、Go进阶

其实很多语言的学习都是类似的,包括 Java,一般就是先简单入门,看看怎么使用,之后去学习它的一些源码,另外这里我需要强调一个点:

就是要先学 Go web 还是先学 Go 进阶?

我觉得这个和 Java 或者 C++ 类似,就是先学集合的源码之后再去做项目,还是先做项目再回过头来学习源码。

我的答案是:都可以。

按照你当时的节奏以及资料顺序来就行,比如有些人的资料,里面本身就安排好了,或者有些资料在学习 Go 入门的时候,就顺带讲了很多进阶的知识了。

也就是说,没有严格的顺序,都可以,你学的顺畅就行。

至于 Go 进阶,主要有以下需要去深入了解下

1、容器类:比如map,slice这些

2、并发:主要是 channel,goroutine 这些

3、标准库:主要是 context, reflect, unsafe 这些

4、内存管理:垃圾回收这些

这几个基本都是 Go 的核心知识,可以深入去学习下,如同 Java 里的并发,JVM,集合源码啥的。

学习资料:推荐这本电子书,之前学习 Go 时还看过他不少文章,链接:https://golang.design/go-questions/

书籍的话,就推荐:《Go语言设计与实现》,这是一本新出的书,这个人我看过他写的文字,也非常硬核。

五、计算机基础的学习

我说过了,无论是走哪一门 语言,校招的话,计算机基础都得学,主要就是计算机网络,操作系统这些,这里我也简单说下吧,其实在其他学习路线中说过。

一般就这几你们

1、计算机网络 + 操作系统

2、数据库 + 计算机组成原理(数据库相应你们可能已经先学过 MySQL 了)

3、汇编 + 编译原理

不过呢,比较重要的是计算机网络 + 操作系统 + 数据库,这三门我单独拿出来说一下重点吧。汇编 + 编译原理 不学也没事,学校有开课就学下,没开就不理了。

一、计算机网络

无论你是从事啥岗位,无论是校招还是社招,计算机网络基本都会问,特特是腾讯,字节,shopee,小米等这些非 Java 系的公司,问的更多。

计算机网络就是一堆协议的构成,下面是一些比较重要的知识点,学的时候可以重点关注下。

物理层、链路层

  1. MTU,MAC地址,以太网协议。
  2. 广播与 ARP 协议

网络层

  1. ip 地址分类
  2. IP 地址与 MAC 地址区别
  3. 子网划分,子网掩码
  4. ICMP 协议及其应用
  5. 路由寻址
  6. 局域网,广域网区别

传输层(主要就是 TCP)

  1. TCP首部报文格式(SYN、ACK、FIN、RST必须知道)
  2. TCP滑动窗口原理,TCP 超时重传时间选择
  3. TCP 拥塞控制,TCP 流量控制
  4. TCP 三次握手与四次挥手以及状态码的变化
  5. TCP连接释放中TIME_WAIT状态的作用
  6. SYN 泛洪攻击
  7. TCP 粘包,心跳包
  8. UDP 如何实现可靠传输
  9. UDP 与 TCP 的区别
  10. UDP 以及 TCP 的应用场景

应用层

  1. DNS 原理以及应用
  2. HTTP 报文格式,HTTP1.0、HTTP1.1、HTTP2.0 之间的区别
  3. HTTP 请求方法的区别:GET、HEAD、POST、PUT、DELETE
  4. HTTP 状态码
  5. HTTP 与 HTTPS 的区别
  6. 数字证书,对称加密与非对称加密
  7. cookie与session区别
  8. 输入一个URL到显示页面的流程(越详细越好,搞明白这个,网络这块就差不多了)

书籍推荐:零基础可以先看《图解HTTP》,当然,也可以直接看《计算机网网络:自顶向下》这本书,这本书建议看两遍以及以上,还有时间的可以看《TCP/IP详解卷1:协议》。

帅地也写过一个极简入门教程:www.iamshuaidi.com/359.html

学完之后可以刷一刷对应的面试题,可以在帅地的网站看:计算机网络面试真题

二、操作系统

操作系统和计算机网络差不多,不过计算机网络会问的多一些,操作系统会少一些,总结起来大致:

1、进程与线程区别

2、线程同步的方式:互斥锁、自旋锁、读写锁、条件变量

3、互斥锁与自旋锁的底层区别

4、孤儿进程与僵尸进程

5、死锁及避免

6、多线程与多进程比较

7、进程间通信:PIPE、FIFO、消息队列、信号量、共享内存、socket

8、管道与消息队列对比

9、fork进程的底层:读时共享,写时复制

10、线程上下文切换的流程

11、进程上下文切换的流程

12、进程的调度算法

13、阻塞IO与非阻塞IO

14、同步与异步的概念

15、静态链接与动态链接的过程

16、虚拟内存概念(非常重要)

17、MMU地址翻译的具体流程

18、缺页处理过程

19、缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法

书籍推荐:《现代操作系统》

这里也有一门合并的视频:计算机基础三门课视频

操作系统也一样,看到可以来网站刷面经,通过面试题来复习:操作系统面试题阅读指南(必看)

三、MySQL

数据库一般主流的有 MySQL 和 Oracle,不过建议大家学习 MySQL 了,因为大部分公司都是使用 MySQL,也是属于面试必问,而且工作中 MySQL 也是接触的最多的,毕竟工作 crud 才是常态。

下面这些是我认为比较重要的知识点:

1、一条 sql 语句是如何执行的?也就是说,从客户端执行了一条 sql 命令,服务端会进行哪些处理?(例如验证身份,是否启用缓存啥的)。

2、索引相关:索引是如何实现的?多种引擎的实现区别?聚族索引,非聚族索引,二级索引,唯一索引、最左匹配原则等等(非常重要)。

3、事务相关:例如事务的隔离是如何实现的?事务是如何保证原子性?不同的事务看到的数据怎么就不一样了?难道每个事务都拷贝一份视图?MVCC 的实现原理(重要)等等。

4、各种锁相关:例如表锁,行锁,间隙锁,共享锁,排他锁。这些锁的出现主要是用来解决哪些问题?(重要)

5、日志相关:redolog,binlog,undolog,这些日志的实现原理,为了解决怎么问题?日志也是非常重要的吧,面试也问的挺多。

6、数据库的主从备份、如何保证数据不丢失、如何保证高可用等等。

7、一些故障排查的命令,例如慢查询,sql 的执行计划,索引统计的刷新等等。

对于 2-4 这四个相关知识,面试被问到的频率是最高的,有时候面试会让你说一说索引,如果你知道的多的话就可以疯狂扯一波了,具体可以看我写的 MySQL 学习路线:肝完了,我的 MySQL 学习之路

书籍:《MySQL必知必会》和咱们星球里的 MySQL实战45讲:MySQL实战45讲

四、Linux 补充

八股文大家基本都知道是啥,不过很多人都没有把 Linux 写上去,其实 Linux 的范围很大,例如 Linux 内核啊,Linux 网络编程等等。

这种不同的岗位可能需要掌握的要求不同,所以我也不讲这些,今天主要帮大家捋一捋 「Linux 基础」这块,就是面试中有可能会问到的,这块需要准备的还是比较少的,下面做一些汇总,方便帅友们到时候可以更加有针对性去复习。

另外,基础操作命令我就不说了,就说一些需要注意的点

基础

1、文件系统:主要就是要了解下 inode,block,superblock,block bitmap 这些关键词的含义。

2、目录的大致含义:例如像 proc 这个目录就放一些进程相关的信息,默认软件安装在 usr 目录等等,这其实是一种规范,这个要大致了解下。

3、文件一些属性:例如有些文件可读,可写,可执行,对应 rwx 权限这些, 通过 d 可以知道这个一个目录等等。

4、软连接与硬链接

5、VIM 的几种模式区别了解一一下

进程与内存等(这块是重点)

1、几个进程命令:ps,top,pstree,netstat,这几个进程要自己用一用,工作后经常用到的,重点学习了解下。

2、Linux 进程的一些状态,记得好几种:R,D,S,Z,T 这五种,要了解下。

3、孤儿进程,僵尸进程 要知道(重要),然后还得知道如何解决这种情况,例如出现大量僵尸进程怎么办

4、中断相关:软中断啊,不可中断状态啊

5、内存中的 Cache 和 buffer 的区别

6、了解 Swap 区

7、SiGCHLD 信号,waitpid() 和 wait() 函数

几种重要的 IO 模型

1、同步,异步。

2、阻塞与非阻塞

3、select,epoll

学习资料指导

有时间 + 零基础的,就看下《鸟哥Linux私房菜》这本书吧,讲的很细,可以看下,跟着做实验,容易做的实验可以跟着做,麻烦的就不需要了,看前面基础的部分就行,后面的可以不看了。

但是呢,这本书只是入门,其实很多没讲的,例如 select,epoll,僵尸进程啥的啊,这种一般,你们哪个不同就看找对应的文章就行,通过文字来逐个了解突破哦。

暂时先说这么多,后面再慢慢补充了,我说的这些都是我自己当时学过的,可能不是那么全,但是核心的基本都说了。

六、算法

算法冲击大厂必须学的了,这里不强调了,看我这篇文章:https://www.iamshuaidi.com/301.html

七、总结

除了语言和框架部分,计算机基础和算法,不过啥学习路线都是差不多滴。

当然,如果你的目标是面试小公司,那么计算机基础和算法可以少学一点,先把 Go 这块相关的技术栈先学起来哦。大家加油勒!


最后,欢迎大家加入帅地的知识星球,其实大部分情况下,大家都很努力,如果有个过来人指点一下,推一把,或许你可以走的更快

帅地会在星球知无不言,无论是 学习规划,offer 选择,简历修改,还是学习路线,帅地都会在 48 小时以内答复你的问题,并且根据你自身的情况,为你量身定制学习路线。

知识星球详情:知识星球

发表评论

后才能评论