谢邀。
一、要不要转 Go?
我之前在携程旅行网写 Java,现在在字节跳动做 Go 开发,Golang 目前的岗位相比较 Java、C/C++ 等岗位来说,不算多,但也不算少,国内一些做云原生相关的公司大量招 Go 开发,例如字节跳动、七牛云、UCloud,腾讯和美团一些业务线也开始往 Go 迁移。
如果你想转 Go 是因为兴趣,那么可以一试。但是,如果是因为觉得 Java 太难太卷、学不好或者学不通透,进而转 Go,这行不通。战术的勤快掩盖不了战略上的懒惰。
目前很多 Go 岗位都接收其他语言转 Go,如 Java 转 Go。但是实际面试的时候,对 Go 语言本身的知识点考察并不多甚至并不考察 Go 知识点本身,反而对其他基本功要求比较多。很多同学找不到工作,并不是因为 Go 本身学的不好,而是其他技能点不够强。
举两个例子。
在利用 Java 做一个管理系统,前端通过 HTTP 接口与后端 Java SSM 框架交互,到了 Go 当中,可能 SSM 框架换成 Gin + Gorm,HTTP 协议还是原来的协议,对 HTTP 协议技能点和数据库的知识点要求并不比 Java 少。
Java 服务与服务之间通信可能会使用 RPC,RPC 这一套东西在 TCP 通信的基础上加上重连重试协议封装等功能,实现了远程过程调用,到 Go 中还会这一套东西,用好,仍然需要良好的网络编程理论。
所以,在 Java 中学不好的,卷不过别人的,不要指望换一个赛道,就可以卷得过别人了。且目前中国的互联网行业趋于稳定阶段,已经过了大肆扩张大肆招人的阶段,而每年的新的计算机专业的同学毕业一茬接一茬,各种通过自学、培训班进入编程领域的,供大于求,所以打铁还需自身硬,努力提高技术功底、技术经验才是正道,而不是换赛道。
二、如何学习 Go?
如果你对 Go 比较感兴趣,那么可以这么学。
2.1 学习Go 语言常用语法和机理
假设你是一个 Go 新人,建议先系统地把 Go 的常用语法特性和内置库先过一遍,推荐《Go 程序设计语言》,或者看看许式伟老师的《Go 语言编程》(链接来自网络,喜欢的请购买正版哦)。《Go 程序设计语言》
链接:https://pan.baidu.com/s/1m_JPCJn1k_b3kjpS7HtW0g 提取码:nid4
《Go 语言编程》
链接:https://pan.baidu.com/s/1NWoGpZ_MVzKHEJtVdz4IuA 提取码:wu7v
当你有一定基础之后,可以看看雨痕大佬的《Go 语言学习笔记》和 《Go 专家编程》进行查漏补缺和提升。《Go 语言学习笔记》
链接:https://pan.baidu.com/s/1FXdjZfjY3LdrL57plcMi0Q 提取码:fw93
《Go 专家编程》
链接:https://pan.baidu.com/s/1_AH1VwP0HCQuoBqS5mY6fQ 提取码:2lep Go 的并发模型相比较 Java 或者操作系统支持的并发原语要简单需要,基本就是 goroutine 和 channel 的结合使用,这块对于高性能高并发 Go 服务是常用的技术点,推荐阅读《Go 并发编程实战》一书:《Go 并发编程实战》
链接:https://pan.baidu.com/s/1bekXSdFJsMHUKykVjq7fnQ 提取码:p4ex 国外有一本《Distributed Computing with Go》(Go 分布式计算)。
网上有同学分享出来相关电子书:链接: https://pan.baidu.com/s/1hLm2Re6LNJdeNEyq1_vTUg 密码: thgs 2.2 阅读优秀开源 Go 项目
多阅读一些优秀开源 Go 项目,可以快速地学习高手如何使用 Go,积累经验,指导自己的 Go 编程。
1 高性能 Web Server——Gin
https://github.com/gin-gonic/gin
Gin 是一个非常非常常用的 Go 开源项目,在很多公司内部,凡是涉及到使用 HTTP 接口与前端交互的系统,基本都会使用这个框架,或者改进版的 Gin。
2 Go 数据库操作层——Gorm
https://github.com/go-gorm/gorm
同样的道理,这是目前国内 Go 语言编写操作数据库使用做的 Go 语言版本 ORM,在 Java 中使用 MyBatis 操作数据库,在 Go 中大多数项目使用 Gorm 操作数据库。
3 tinode
这是一个开源的即时通讯软件,既然是即时通讯软件,学习的时候基本上无任何业务负担,可以专注地学习程序逻辑本身。
服务端代码(使用 Go 开发)地址:
tinode/chat
搭建出来的服务部分截图:
4 斗鱼直播的朱庇特
项目官网:Jupiter
项目源码地址:douyu/jupiter
通过这个项目,你可以学习到如何使用 Go 开发:
- 支持 HTTP 请求
- 支持 RPC 请求、RPC 实现
- 服务注册与发现
- 长短任务设计
- 负载均衡
- 指标采集/链路追踪/日志埋点
- 慢响应拦截
- 熔断限流
- 接入各种消息中间件(如 Kafka、RocketMQ 等)
- 接入各种缓存服务(如 Redis)
- 其他功能
三、为什么一些大厂会选择 Go 语言?
个人使用 Go 快三年多了,Go 语言的学习和上手成本比较低,且性能不错,适用于大厂快速的业务迭代发展。总结起来,性能不错,快速上手,适合业务快速迭代
下面举一些 Go 语法的例子。
在使用其他语言,如 Java,我就在想,既然代码行末尾必须都要以分号结束,那为啥编译器不直接代劳此事?从编译原理的角度来说,大多数代码行末尾的分号都是没有任何作用的。我相信,不少同学有因为忘记在某些代码行的结尾写上分号而导致代码无法编译通过的经历。
另外一个情形就是很多同学在写 switch - case 语句的时候,有时候因为忘记在特定的 case 语句之后写上 break 语句,从而导致程序执行时出现非预期的行为,这个问题也同样困扰着学习编程的新人们。
一对大括号中的第一个大括号是否要单独放在一行;if/for 等执行体只有一条语句时,是否应该使用一对大括号包裹起来,这类问题在开发者之间争论了几十年,并且将继续在后来者那里争论下去,就算是像《代码大全》这样经典的书籍也花了好几页去讨论这两种代码风格哪种好,更不用说各个公司为了统一编码风格而制定的各种代码规范和 lint 检查规则了。- //到底哪种风格好呢?
- //风格1
- void DoTest() {
- }
- //风格2
- void DoTest()
- {
- }
- //风格1
- if (success) {
- printf("success");
- }
- //风格2
- if (success)
- printf("success");
复制代码 继往开来,Go 语言大刀阔斧地去除了一些其他语言中看起来不是很必要的功能,这些功能的去除让 Go 的风格变得统一、简洁,在 Go 项目中,大家不会再为上文中提到的几个风格问题而争论了。
让我们来看一下 Go 语言相对于其他语言所做的一些改动,欢迎读者在评论区补充:
1. 每一行语句的结尾不再强行要求加上分号- fmt.Println("hello world") //末尾不建议加;
复制代码 2. 一对大括号的第一个不能单独占一行- //错误的语法
- func DoTest()
- {
- }
- //正确的语法
- func DoTest() {
- }
复制代码 3. if/for 等语句体只有一行时也必须使用一对大括号包裹起来- //正确的语法
- if success {
- printf("success")
- }
- //错误的语法
- if (success)
- printf("success")
复制代码 4. if/for 等条件不再需要括号- //正确的语法
- for i := 1; i < 10; i++ {
- fmt.Println(i)
- }
- //错误的语法,for语句不需要括号
- for (i := 1; i < 10; i++) {
- fmt.Println(i)
- }
复制代码 5. 只有 for 循环,不再支持 while 和 do - while 循环- //支持的语法
- for i := 1; i < 10; i++ {
- fmt.Println(i)
- }
- //不支持的语法
- while i < 100 {
- fmt.Println(i)
- i++
- }
复制代码 6. switch - case 语句默认加了 break 语句- switch i {
- case 0:
- fmt.Println(0)
- case 1:
- fmt.Println(1)
- case 2:
- fmt.Println(2)
- default:
- }
- //相当于
- switch i {
- case 0:
- fmt.Println(0)
- break
- case 1:
- fmt.Println(1)
- break
- case 2:
- fmt.Println(2)
- break
- default:
- }
复制代码 如果你真的想执行完一个 case 接着执行下一个 case,只要使用 fallthrough 关键字就可以了:- switch i {
- case 0:
- fmt.Println(0)
- fallthrough
- case 1:
- fmt.Println(1)
- case 2:
- fmt.Println(2)
- default:
- }
复制代码 7. 自增自减运算符只支持后缀形式,不支持前缀形式- i := 0
- i++ //可以编译通过
- ++i //无法通过编译
复制代码 8. 不支持条件运算符(? :)- b := 9
- a := (b > 0 ? true : false) //这一行无法通过编译
复制代码 9. 给一个结构体多个字段设置值时,最后一个字段也必须以逗号结束- type StandardResp struct {
- Code int32
- Msg string
- Data interface{}
- }
- c.JSON(http.StatusOK, commonHttp.StandardResp{
- Code: 1000,
- Msg: &#34;token error&#34;,
- Data: nil, //注意这里nil之后有一个逗号,这在其他语法中必须没有逗号
- })
复制代码 以上列举了 Go 精简后的一些语法要素,精简后的语法,让编程初学者更容易记忆与上手。
极少的语法元素,让 Go 简单易学,字节的大多数同学都是入职后两周内学习的 Go,然后开始着手业务开发。
综上所述,我给出我的结论,正因为 Go 语言简单易学、不容易出错、功能完备性良好且执行效率高,特别适合字节这样有超多超快的业务线产品迭代。当然,Go 语言想入门容易,想学好成为高手并不容易,很多从其他语言转到 Go 开发的同学,若不刻意勤加练习,想写出地道、高效的 Go-Style 风格的代码也不是一件很容易的事情。
四、Go 职位内推
最后,再次说一下,字节跳动常年大量招人,如果你也想来字节做 Go 开发, 我可以帮你内推,内推链接:
https://job.toutiao.com/s/MsK6h49
相关阅读
加入字节跳动 455 天,谈一谈我的感受
原创不易,有帮助的请点赞和关注 @张小方 ~ |