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 语言入门
另外就是关于 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语言设计与实现》,这是一本新出的书,这个人我看过他写的文字,也非常硬核。
五、计算机网络
无论你是从事啥岗位,无论是校招还是社招,计算机网络基本都会问,特特是腾讯,字节,shopee,小米等这些非 Java 系的公司,问的更多。这块认真学,一个半月就可以搞定了。
计算机网络就是一堆协议的构成,下面是一些比较重要的知识点,学的时候可以重点关注下。
物理层、链路层:
- MTU,MAC地址,以太网协议。
- 广播与 ARP 协议
网络层
- ip 地址分类
- IP 地址与 MAC 地址区别
- 子网划分,子网掩码
- ICMP 协议及其应用
- 路由寻址
- 局域网,广域网区别
传输层(主要就是 TCP)
- TCP首部报文格式(SYN、ACK、FIN、RST必须知道)
- TCP滑动窗口原理,TCP 超时重传时间选择
- TCP 拥塞控制,TCP 流量控制
- TCP 三次握手与四次挥手以及状态码的变化
- TCP连接释放中TIME_WAIT状态的作用
- SYN 泛洪攻击
- TCP 粘包,心跳包
- UDP 如何实现可靠传输
- UDP 与 TCP 的区别
- UDP 以及 TCP 的应用场景
应用层
- DNS 原理以及应用
- HTTP 报文格式,HTTP1.0、HTTP1.1、HTTP2.0 之间的区别
- HTTP 请求方法的区别:GET、HEAD、POST、PUT、DELETE
- HTTP 状态码
- HTTP 与 HTTPS 的区别
- 数字证书,对称加密与非对称加密
- cookie与session区别
- 输入一个URL到显示页面的流程(越详细越好,搞明白这个,网络这块就差不多了)
书籍推荐:零基础可以先找个视频看看,然后有了一定基础可以看《计算机网网络:自顶向下》这本书,这本书建议看两遍以及以上,还有时间的可以看《TCP/IP详解卷1:协议》。
六、操作系统
操作系统和计算机网络差不多,不过计算机网络会问的多一些,操作系统会少一些,总结起来大致:
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 学习之路](
六、算法
算法冲击大厂必须学的了,这里不强调了,看我这篇文章: 算法学习路线
七、总结
除了语言和框架部分,计算机基础和算法,不过啥学习路线都是差不多滴。
当然,如果你的目标是面试小公司,那么计算机基础和算法可以少学一点,先把 Go 这块相关的技术栈先学起来哦。大家加油勒!