背景:C9计算机本硕,刚参加完22年秋招,纯Golang选手,斩获多大厂SP offer

如果最近正在找实习没什么思绪,可以看我这篇分享:

00 前言

最近有学弟吐槽Java越学坑越深,自己精力有限,感觉是力不从心,很可能学不完,然后自己开始想转Go,求一份学习路线。我恰好会一点点,但是会的也不多。做这份路线时候我没把一堆资料教程全扔出来,怕就怕最后沦为收藏吃灰的下场,秉持着多不如精的思想,保证学习先掌握精髓,就做了这份学习路线。虽然不多,但是学完了找工作还是不成问题的

针对具体学什么语言可以看看我这篇分享:

事先说明:不用吐槽学了某门语言就找不到工作了,找不到工作的人换语言赛道其实还是找不到工作,因为换语言解决不了问题,更重要的是算法刷题、计算机网络、操作系统、数据结构、计算机组成原理、设计模式这些通用东西,以及自己的核心竞争力。

01 Go的岗位

国内目前很多公司在用Go,如字节、腾讯、百度、阿里云、蚂蚁金服、京东、滴滴、深信服、米哈游等,岗位如下:

  • 后端开发:用于开发 Web 服务器、API 服务、微服务、分布式系统等后端应用,原先是字节跳动带起来的,现在越来越多的公司技术上开始向Go迁移了。
  • 基础设施开发:基于K8s开发本公司的基础平台,京东、TiDB用Go搭建自己的分布式存储系统,这部分工资还算不错
  • 游戏服务器开发:用Go开发服务器效率很高,性能也不错,这部分主要工作是编写游戏逻辑、网络通信等模块。
  • 区块链:区块链需要高度安全性和并发性,用 Go 进行区块链开发很合适。目前许多主流的区块链项目,如 Ethereum、Hyperledger Fabric、Cosmos SDK 等都采用了 Go 作为主要开发语言。

有人担心岗位不够,但是能投的还是挺多的,举个例子最近的米哈游校园招聘:

可以看到很多都要求是Go优先,其他公司也有就不举例子了,职位上不用担心。我也是在22年招聘寒冬拿到字节、百度、华为等公司的offer的。

02 Go基础

相信大家第一门入门的编程语言一定是C语言,Go被称为21世纪的C语言,同样也有语法简单、性能高效的特点。与C语言对比,Go提供了更友好的并发编程、内存管理、标准库的支持,解决了C的一些不足。如果你有其他高级语言的编程经验,学习Go应该非常容易。

基础阶段一般是1~3周的学习时间,这个阶段主要学习的内容如下:

  • 语言基础:包括基本语法、数据类型、变量、常量、运算符、流程控制语句等
  • 函数:包括函数的定义和参数传递、匿名函数等
  • 数组、切片和map:包括数组、切片和map的定义、初始化、添加、删除操作
  • 结构体和指针:包括定义、访问、操作
  • 接口和类型断言:包括接口定义、类型断言操作
  • 并发编程:包括goroutine、channel、锁等
  • 文件和网络编程:包括文件和网络编程的基本概念和实现方式

文档学习和视频学习根据自己习惯选一种方式即可,下面是我看过的一些比较优质的教程。

文档类

【官方教程 A Tour of Go】

网址:

【GoGuide】

网址:

视频类

【七米老师】

视频地址:

博客地址:

【IT营】

视频地址:

03 GoWeb+数据库

Web基础和数据库高度相关就放一起了,学习Web主要掌握路由、中间件、参数绑定、渲染模板等功能;学习数据库主要学习Go如何使用SQL对数据库进行数据存储,以及ORM框架如GORM的使用。

Web

目前比较流行的GoWeb框架有Gin、Echo、Beego、Iris等,这边推荐学Gin就可以了。

【Gin框架】

主要是阅读Gin框架的文档和示例代码,了解gin的API和特性,例如路由、中间件、JSON解析等。

官方文档:

视频教程:

数据库

这阶段是以数据库为基础开始学习的。在你学过数据库了解操作,再来学习如何用Go操作数据库。不要本末倒置

【sqlx】

sqlx是一个基于Go语言的第三方库,它提供了一组扩展了标准库database/sql的功能。性能敏感的喜欢裸写sql,用sqlx。

网址:

【GORM】

GORM提供了一种简单的方法来处理关系型数据库操作。ORM代表对象关系映射,允许将对象模型映射到关系型数据库模型中,从而简化数据访问。

网址:

视频教程:

【Redis】

这里的学习主要是熟悉API操作,没什么原理和技巧性内容。所以请先去Redis之后再来动手实践。

网址:

04 Go进阶

源码

阅读Go的源代码是理解Go语言的关键步骤。可以从标准库开始,逐渐深入了解Go的内部工作原理。学习过程中重点查看一些Go的实现细节和设计决策,如Go的内存模型、调度器、垃圾回收等。

【官方标准库】

网址:

【煎鱼的博客】

覆盖 Go 语言从编译到运行的方方面面,让你对 Go 语言有更加整体和深刻的认识。

网址:

Ggo

【Go语言高级编程】

了解如何在Go代码中调用C语言的函数和访问C语言的数据类型。

网址:

Test

很多人不喜欢或者不会写软件的测试,但是写好测试可以解决开发过程中的大部分问题

【Learn Go with tests】

通过编写测试驱动的代码来了解Go语言的基础知识,项目覆盖了基本语法、数据类型、函数、指针、错误处理、并发编程等测试方面的内容。

网址:

【gomock】

Go语言的一个Mock框架,用于在单元测试中模拟和替换依赖项的行为,大厂比较常用的Golang测试库。

网址:

设计模式

学习设计模式可以解决复杂的软件设计问题,提高代码的可重用性、可维护性和可扩展性,属于编程的内功。如果没学过设计模式正好通过【Go设计模式24】一同学习了

【Go设计模式24】

网址:

05 云原生和微服务

云原生

Docker和K8s太出名就不多介绍了,视频教程我看了不少,推荐一下认为讲的比较好的视频教程,想深入学习还是得自己补充很多东西。

【Docker】

官网:

视频教程:


【K8s】

官网:

视频教程:


微服务

gRPC、Istio和micro都是基于云原生架构的微服务框架,都支持使用微服务架构构建云原生应用程序。学一个掌握思想就可以了。

【gRPC】

Google开发的开源RPC框架,使用Protocol Buffer作为默认的消息序列化机制。

网址:


【Istio】

Istio是一个开源的服务网格平台,提供了流量管理、安全、监控和跟踪等功能。

网址:


【micro】

一个轻量级的微服务框架,提供了基于Go语言的微服务运行时和一组基本服务,如服务发现、负载均衡和配置管理等。

网址:


06 实战

这部分主要是造轮子,帮你更好地掌握开发的细节实现和架构设计,加深动手实践能力。

【go-admin】

基于Golang和Vue的后台管理系统框架,支持MySQL、PostgreSQL等多种数据库,包括文件上传、验证码、邮件发送、权限验证等功能,可以自己尝试造一遍。


【七天实现Web框架】

网址:

  • 第一天:前置知识(http.Handler接口)
  • 第二天:上下文设计(Context)
  • 第三天:Trie树路由(Router)
  • 第四天:分组控制(Group)
  • 第五天:中间件(Middleware)
  • 第六天:HTML模板(Template)
  • 第七天:错误恢复(Panic Recover)


【7天实现分布式缓存】

网址:

  • 第一天:LRU 缓存淘汰策略
  • 第二天:单机并发缓存
  • 第三天:HTTP 服务端
  • 第四天:一致性哈希(Hash)
  • 第五天:分布式节点
  • 第六天:防止缓存击穿
  • 第七天:使用 Protobuf 通信


【七天实现ORM】

网址:

  • 第一天:database/sql 基础
  • 第二天:对象表结构映射
  • 第三天:记录新增和查询
  • 第四天:链式操作与更新删除
  • 第五天:实现钩子(Hooks)
  • 第六天:支持事务(Transaction)
  • 第七天:数据库迁移(Migrate)


【七天实现RPC】

网址:

  • 第一天:服务端与消息编码
  • 第二天:支持并发与异步的客户端
  • 第三天:服务注册(service register)
  • 第四天:超时处理(timeout)
  • 第五天:支持HTTP协议
  • 第六天:负载均衡(load balance)
  • 第七天:服务发现与注册中心(registry)

07 面试

答案网址:golang

进程、线程、协程的区别?

goroutine相比线程的优势?

go与Java的区别?

go语言中是如何实现继承的?

for遍历多次执行goroutine会存在什么问题?

init函数是什么时候执行的?

slice的扩容机制?

slice是线程安全的吗?

slice之间怎么进行比较?

map之间如何进行比较?

map如何实现顺序读取?

map的底层数据结构?

bucket是如何工作的?

map的查找过程?

如何实现一个线程安全的map?

channel的概念?

channel有哪些状态?

如何判断channel已经关闭?

channel的底层实现原理?

channel发送数据和接收数据的过程?

channel是否线程安全的?

channel如何实现线程安全的?

channel的应用场景?

select的用途?

defer的概述?

defer的使用场景?

defer函数和return的执行顺序?

GMP模型?

GMP的调度流程?

goroutine什么时候会被挂起?

golang的垃圾回收?

垃圾回收的触发条件?