2

我是如何从 php 转型写 go 的

 3 years ago
source link: https://studygolang.com/articles/33221
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本来想延续上一个公众号 <<不定期更新的日常>>系列,但是想想还是先写下这篇吧。希望对那些刚转型 Go 或者有意向转型的小伙伴有所帮助。

起点

去年七月初的时候,在上家公司感觉到毕业以来第一次瓶颈,加上小公司项目半凉的状态,随即提出离职。在交接的过程中,我开始投递简历出来面试,因为学历并不是很好,加之在开源世界并没有什么拿得出手的项目,也就没对大厂抱有希望,整个期间就面了三家公司,拿了其中两家 offer,一家做直播的,一家做电商行业的,选择了电商的那家,不算很大,一千多人还是有的,然后就完成了离职到就职的无缝连接,现在入职半年多了。

面试的时候面的就是 php 岗位,因为也没别的语言经验,入职第一周没有具体的工作安排,就是熟悉环境。第二周开始接了点小需求,评审之后看了下也不是很难。不过新公司第一次上线多少还是有点忐忑的,好在没出啥问题,一切正常。

来到八月份,因为我们做的是一个全新的项目,我开始搭建一些基础的,和业务没什么牵扯的模块,还对接了一些平台。

大概到九月初的时候,由于某种场景不太适合使用 php,加上我们有意识的想把纯业务的和底层通用模块做分离。了解到其他部门在搭建他们的中台业务也是把技术栈从 php 迁移到 Go,加上内部也有专门的部门去搭建 Go 框架、封装公用提高业务开发效率的包……,然后老大就过来问我,有没有意向搞 Go,我的回答是求之不得!!!

我大概花了一天的时候,过一下语法。我之前提到过,看了学院君的 Go 入门教程。简单的把上面的基础语法过了一遍,全程敲下来。因为之前有偷偷学过一点,所以没花多少时间就恢复了之前为数不多的功力。这时候已经能看懂这样简单的代码了。

package main

import "fmt"

func main() {
  go func() {
    fmt.Println("打印不?")
  }()
}

如果你一直沉寂在 php-fpm 那一套,导致的现象可能是你不知道上面的运行结果。别不信,好多人真的不知道为什么,当然我没有黑语言的意思。

接着因为公司内部的框架有基于 gin。我就把 gin 官网的 demo 自己全敲了一遍,我也建议你这样干。初学者,要学会从模仿做起,模仿当然就是动手操作。

然后老大就让一个大佬给我开了一个基于公司内部框架构建的一个业务项目,不是很大,我跑下来之后,根据 readMe 进行系列操作,运行过程也有点坎坷,还踩到一个坑,虚心请教了大佬后才解决。根据这个项目去了解它的运行流程、生命周期以及涉及到的知识点……,这时候千万不要陷入代码细节,细节是魔鬼!

大概过了三天,我就开始动手写我们部门的项目了,一直写到现在。这个过程很有趣,我经常在后一天发现前几天实现的并不好, 然后就是持续重构,持续调整。

我是咋么发现的呢?

当然是学习!首先,那段时间除了在公司实现需求过程中,遇到 Go 相关不明白的点,比如包之类的,那就去官网搜,或者看一些文章。遇到内部框架不明白的地方,就去请教大佬,大佬对我总是那么和蔼可亲。

下班后,我也没闲着,疯狂的补充 Go 相关的知识,记得我有次看 sync.Mutex 里面定义的常量不明白,后面就专门去查了资料。其实是很基础的东西,代码如下,

const (
    mutexLocked = 1 << iota // mutex is locked
    mutexWoken
    mutexStarving
    mutexWaiterShift = iota

)

func main() {
    fmt.Println("mutexLocked的值",mutexLocked)
    fmt.Println("mutexWoken的值",mutexWoken)
    fmt.Println("mutexStarving的值",mutexStarving)
    fmt.Println("mutexWaiterShift的值",mutexWaiterShift)
   //为什么结果是:
// mutexLocked的值 1
// mutexWoken的值 2
// mutexStarving的值 4
// mutexWaiterShift的值 3
}

想想那时候就有趣。

书籍

当然也要看书,我是在去年12月初知道的,公众号 polarisux 回复 ebook,Go 从入门到进阶的书都有。

图片

首先,书并不是越多越好,等你看完相关的书你会发现很多书的知识点同质化。

这时候你要做的是什么?

除了吸收基础的知识之外,我还会做一个有趣的事情,就是看两本书对于相同的知识点的不同阐述,然后你就会发现 A 书未提及的 B 书做了补充,B 书遗漏的点 A 书补上了,

有趣吧?当然了,如果你能延伸出它们都未曾提及的,那么,请收下我的膝盖。

我看书有个习惯,并不会从头看到尾。我认为,一本书并不是每一章都对我有价值,因人而异。

我会选择性地进行阅读,对我目前有帮助的或者我需要去掌握落地到具体工作中的,重点去细读,精读。并且动手去实践以及输出自己的思考。

在读一本书的时候,一定是带有目的性的,读完要得到什么?是否可以施展到工作?看完了,我能掌握它的用法吗?最好画一个类似思维导图,等读完书后,回过头看思维导图,这些知识点都掌握了吗?

源码

然后就是看源码。

当我们不知道怎么去写好的代码,就需要去学习优秀的人是如何设计代码的,可以想象同一个场景,你会如何设计代码?再看看别人是如何设计的,对比下,差距大吗?

我比较喜欢看别人的代码,可惜目前看的还不够多。但是有过从头到尾把一个小而精项目的源码看完,有些知识不一定当场就能吸收,需要慢慢去消化。

看源码最避讳的就是一上来就陷入代码细节,切记!

对我来说,当我去看源码的时候,不管是 Go 本身的,还是第三方包,首先我肯定是已经在使用了,已经知道它的用途,应用场景以及一些使用上的操作,这是前提。

然后需要知道它的整体架构,这个一般项目都会有一个大概介绍,它的模块组成,他们之间的关系、交互,大概就这些,然后分模块去阅读源码,这个过程中,你就能慢慢去阅读作者的设计,你就能了解到作者更多的细节,再联想到自己,都写的啥?

总结

这篇文章大体介绍了一下我四个多月的 Go 之路,希望对你有所帮助。另外,我想说的是,学习并不是短跑,它并不会短时间内快速到达终点,更确切的说,它没有终点。

学习是需要通过持续不断的积累,才会引发质变。学习方式也并没有固定的模板,你需要找到一种最适合自己的方式,然后把头埋下来,坚持。在你累的时候,不要忘记抬起头,看看前面的路。共勉!

imENrmr.png!mobile

有疑问加站长微信联系(非本文作者)

eUjI7rn.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK