Golang 目前的岗位相比较 Java、C/C++ 等岗位来说,不算多,但也不算少,国内一些做云原生相关的公司大量招 Go 开发,例如字节跳动、七牛云、UCloud,腾讯和美团一些业务线也开始往 Go 迁移。

我目前在字节跳动做 Go 开发,需要内推的可以点击下面的内推码查看在招岗位(定期更新,长期有效):

谢邀。

说说我写 Go 的感受吧:

一、为什么某些大厂会选择 Go 语言作为开发语言?

根本原因,我觉得 Go 的学习和上手成本比较低,且性能不错,适用于大厂快速的业务迭代发展。

下面举一些语法简化的例子。

工作的早些年,曾思考这样一个问题,既然大多数的代码行末尾必须都要以分号结束,那为啥编译器不直接代劳此事?从编译原理的角度来说,大多数代码行末尾的分号都是没有任何作用的。

而更早的学生时代,我常常因为忘记在某些代码行的结尾写上分号而导致代码无法编译通过,我相信,在今天,数以万计的刚开始接触编程的同学也遇到和我曾经一样的问题。

另外一个情形就是很多同学在写 switch - case 语句的时候,有时候因为忘记在特定的 case 语句之后写上 break 语句,从而导致程序执行时出现非预期的行为,这个问题也同样困扰着学习编程的新人们。

一对大括号中的第一个大括号是否要单独放在一行;if/for 等执行体只有一条语句时,是否应该使用一对大括号包裹起来,这类问题在开发者之间争论了几十年,并且将继续在后来者那里争论下去,就算是像《代码大全》这样经典的书籍也花了好几页去讨论这两种代码风格哪种好,更不用说各个公司为了统一编码风格而制定的各种代码规范和 lint 检查规则了。

继往开来,Go 语言大刀阔斧地去除了一些其他语言中看起来不是很必要的功能,这些功能的去除让 Go 的风格变得统一、简洁,在 Go 项目中,大家不会再为上文中提到的几个风格问题而争论了。

让我们来看一下 Go 语言相对于其他语言所做的一些改动,欢迎读者在评论区补充:

1. 每一行语句的结尾不再强行要求加上分号

2. 一对大括号的第一个不能单独占一行

3. if/for 等语句体只有一行时也必须使用一对大括号包裹起来

4. if/for 等条件不再需要括号

5. 只有 for 循环,不再支持 while 和 do - while 循环

6. switch - case 语句默认加了 break 语句

如果你真的想执行完一个 case 接着执行下一个 case,只要使用 fallthrough 关键字就可以了:

7. 自增自减运算符只支持后缀形式,不支持前缀形式

8. 不支持条件运算符(? :)

9. 给一个结构体多个字段设置值时,最后一个字段也必须以逗号结束

以上列举了 Go 精简后的一些语法要素,精简后的语法,让编程初学者更容易记忆与上手。

极少的语法元素,让 Go 简单易学,字节的大多数同学都是入职后两周内学习的 Go,然后开始着手业务开发。

综上所述,我给出我的结论,正因为 Go 语言简单易学、不容易出错、功能完备性良好且执行效率高,特别适合字节这样有超多超快的业务线产品迭代。当然,Go 语言想入门容易,想学好成为高手并不容易,很多从其他语言转到 Go 开发的同学,若不刻意勤加练习,想写出地道、高效的 Go-Style 风格的代码也不是一件很容易的事情。

二、学习 Go 的建议

2.1 学习Go 语言

如果你是一个 Go 新人,建议先系统地把 Go 的常用语法特性和内置库先过一遍,推荐《Go 程序设计语言》,或者看看许式伟老师的《Go 语言编程》(链接来自网络,喜欢的请购买正版哦)。

当你有一定基础之后,可以看看雨痕大佬的《Go 语言学习笔记》和 《Go 专家编程》进行查漏补缺和提升。

Go 的并发模型相比较其他语言或者操作系统支持的并发原语要简单需要,基本就是 goroutine 和 channel 的结合使用,这块对于高性能高并发 Go 服务是常用的技术点,推荐阅读《Go 并发编程实战》一书:

《Go 并发编程实战》
链接:https://pan.baidu.com/s/1bekXSdFJsMHUKykVjq7fnQ
提取码:p4ex

国外有一本《Distributed Computing with Go》(Go 分布式计算)。

网上有同学分享出来相关电子书:

然后研究学习一些开源项目,假以时日,一定能拥有不错的 Go 水平了。

2.2 推荐一些不错的开源 Go 项目

阅读一些优秀开源 Go 项目,也能让你在面试时就项目经验侃侃而谈赢得面试官青睐。

一、高性能 Web Server——Gin

二、Go 数据库操作层——Gorm

这是目前国内 Go 语言编写操作数据库使用做的 Go 语言版本 ORM。

三、tinode

这是一个开源的即时通讯软件,既然是即时通讯软件,学习的时候基本上无任何业务负担,可以专注地学习程序逻辑本身。

服务端代码(使用 Go 开发)地址:

搭建出来的服务部分截图:

四、斗鱼直播的朱庇特

项目官网:Jupiter

项目源码地址:douyu/jupiter

通过这个项目,你可以学习到如何使用 Go 开发:

  • 支持 HTTP 请求
  • 支持 RPC 请求、RPC 实现
  • 服务注册与发现
  • 长短任务设计
  • 负载均衡
  • 指标采集/链路追踪/日志埋点
  • 慢响应拦截
  • 熔断限流
  • 接入各种消息中间件(如 Kafka、RocketMQ 等)
  • 接入各种缓存服务(如 Redis)
  • 其他功能

2.3 光学 Go 还不够

目前很多 Go 岗位都接收其他语言,如 Java 或者 C/C++ 转 Go,因此面试的时候,对 Go 的要求并不高,反而对其他基本功要求比较多。很多同学找不到工作,并不是因为 Go 本身学的不好,而是其他技能点不够强。这些技能点包括哪些呢?

如果你是应届生或者工作年限不长,算法和数据结构是必考内容。

大多数技术岗面试的算法题其实不难,我整理了一些常问的算法题:

大多数算法题都是《剑指 offer》这本书上的原题,建议相关的社招同学可以在面试字节前翻一翻这本书上的算法题,保持对一些常见算法题的敏感度。

网上有人分享了这本书(喜欢的同学请购买正版哦):

除了算法和数据结构的知识,其他的就需要自己的积累了,如操作系统、计算机网络、数据库、分布式等知识。

最后,再次说一下,我们常年大量招人,如果你也想来字节做 Go 开发, 我可以帮你内推,内推链接:

原创不易,有帮助的请点赞和关注 @张小方 ~