先说结论:
虽然说 Golang 在国内势头发展的很好,但是 Go 取代 C 或者 C++ 基本上是不可能的。C/C++ 的很多领域 Go 无法取代,例如操作系统内核、一些大型应用软件、桌面软件等等。
我目前在字节跳动做 Go 开发,Golang 目前的岗位相比较 Java、C/C++ 等岗位来说,不算多,但也不算少,国内一些做云原生相关的公司大量招 Go 开发,例如字节跳动、七牛云、UCloud,腾讯和美团一些业务线也开始往 Go 迁移。
如果你想转 Go 是因为兴趣,那么可以一试。但是,如果是因为觉得其他语言太难、学不好或者学不通透,进而转 Go,这行不通。战术的勤快掩盖不了战略上的懒惰。
目前很多 Go 岗位都接收其他语言转 Go,如 Java 或者 C/C++ 转 Go,因此面试的时候,对 Go 语言本身的考察并不多,反而对其他基本功要求比较多。很多同学找不到工作,并不是因为 Go 本身学的不好,而是其他技能点不够强。这些技能点包括哪些呢?
如果你是应届生或者工作年限不长,算法和数据结构是必考内容。我目前也任技术面试官,整理了一些常问的算法题:
除了算法和数据结构的知识,其他的就需要自己有意识地学习和积累了,如操作系统原理、计算机网络、数据库、分布式等知识。
所以,一句话,Go 有一定的前景,但是光学 Go,不注重其他基本功,是没有前景的。
一、为什么一些大厂会选择 Go 语言作为开发语言?
Go 语言的学习和上手成本比较低,且性能不错,适用于大厂快速的业务迭代发展,一次得到了一些大厂的青睐。
下面举一些 Go 语法的例子。
在使用其他语言,如 C/C++ 的时候,我就在想,既然代码行末尾必须都要以分号结束,那为啥编译器不直接代劳此事?从编译原理的角度来说,大多数代码行末尾的分号都是没有任何作用的。
而更早的学生时代,我常常因为忘记在某些代码行的结尾写上分号而导致代码无法编译通过,我相信,在今天,数以万计的刚开始接触编程的同学也遇到和我曾经一样的问题。
另外一个情形就是很多同学在写 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 分布式计算)。
网上有同学分享出来相关电子书:
2.2 阅读优秀开源 Go 项目
阅读一些优秀开源 Go 项目,可以快速地学习高手如何使用 Go,积累经验,指导自己的 Go 编程。
一、高性能 Web Server——Gin
Gin 是一个非常非常常用的 Go 开源项目,在很多公司内部,凡是涉及到使用 HTTP 接口与前端交互的系统,基本都会使用这个框架,或者改进版的 Gin。
二、Go 数据库操作层——Gorm
同样的道理,这是目前国内 Go 语言编写操作数据库使用做的 Go 语言版本 ORM,在 Java 中使用 MyBatis 操作数据库,在 Go 中大多数项目使用 Gorm 操作数据库。
三、tinode
这是一个开源的即时通讯软件,既然是即时通讯软件,学习的时候基本上无任何业务负担,可以专注地学习程序逻辑本身。
服务端代码(使用 Go 开发)地址:
搭建出来的服务部分截图:
四、斗鱼直播的朱庇特
项目官网:Jupiter
项目源码地址:douyu/jupiter
通过这个项目,你可以学习到如何使用 Go 开发:
- 支持 HTTP 请求
- 支持 RPC 请求、RPC 实现
- 服务注册与发现
- 长短任务设计
- 负载均衡
- 指标采集/链路追踪/日志埋点
- 慢响应拦截
- 熔断限流
- 接入各种消息中间件(如 Kafka、RocketMQ 等)
- 接入各种缓存服务(如 Redis)
- 其他功能
三、想做 Go 开发?
最后,再次说一下,字节跳动常年大量招人,如果你也想来字节做 Go 开发, 我可以帮你内推,内推链接:
原创不易,有帮助的请点赞和关注 @张小方 ~