大家好,我是帅地。
Go 学习路线拖了好久了,主要是 Go 不像 Java,有着丰富的学习资料 + 过来人的各种踩坑,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,学起来还是不难,就是容易把一些语法忘了,所以在学的时候,我希望大家可以前期多做一些练习,主要就是属于语法的使用。
如果你是 0 基础的,有些学起来还是有点小难度,不过也问题不大,多看几遍就好了。
说实话,入门这块,没啥好说的,学习任何一门语言都一样,随便找个简易的教程,跟着学就行了,知识点也没啥强调的,反正都得掌握。
一般就是这几个:
1、函数:Go 的函数,还是和 Java 啥的有一点点不一样。
2、指针
3、结构体
4、面向对象的知识以及它的特性(注意和Java/C++的一些区别)
5、IO处理
5、还有一个非常重要的 goroutine 和 channel 这两个。
如果你喜欢看视频,可以在 B 站 或者慕课网找个播放量高的视频就行,这里我就不推荐了。
如果你喜欢看文字,那么可以在菜鸟教程这里找,快速入门还挺不错:https://www.runoob.com/go/go-tutorial.html
另外就是关于 Go 的书籍,目前有一本用的人比较多的是《Go程序设计语言》,这本书我看过一部分,个人觉得不适合 0 基础的初学者哈,我还是建议大家入门就找个视频或者找个简易的教程,后面入门之后,再来看这些书。
学完 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 这几个
其实很多语言的学习都是类似的,包括 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 系的公司,问的更多。
计算机网络就是一堆协议的构成,下面是一些比较重要的知识点,学的时候可以重点关注下。
物理层、链路层:
网络层
传输层(主要就是 TCP)
应用层
书籍推荐:零基础可以先看《图解HTTP》,当然,也可以直接看《计算机网网络:自顶向下》这本书,这本书建议看两遍以及以上,还有时间的可以看《TCP/IP详解卷1:协议》。
帅地也写过一个极简入门教程:www.iamshuaidi.com/359.html
学完之后可以刷一刷对应的面试题,可以在帅地的网站看:https://www.iamshuaidi.com/?p=673
操作系统和计算机网络差不多,不过计算机网络会问的多一些,操作系统会少一些,总结起来大致:
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、缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法
书籍推荐:《现代操作系统》
这里也有一门合并的视频:计网+操作系统+计组入门教程
操作系统也一样,看到可以来网站刷面经,通过面试题来复习:https://www.iamshuaidi.com/?p=1346
数据库一般主流的有 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讲:https://t.zsxq.com/UjuJ2Z
八股文大家基本都知道是啥,不过很多人都没有把 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 这块相关的技术栈先学起来哦。大家加油勒!
-------- END----------