『喜欢本篇请不吝点赞,感兴趣后续文章请关注我、关注我的专栏,谢谢您的支持鸭』


【TL;DR | “太长不看”版】

Q1:Go语言适合编程语言零基础入门吗?
A1:不推荐,学习理解Go语言最难的不在语法上,而在设计理念上,有其他语言基础能力(编译型语言更佳)再来学习它可以更容易上手。

Q2:Go语言好用吗?实用吗?
A2:刚上手可能需要一些时间熟悉它的使用习惯,有方便之处也有麻烦之处,内置的标准库已经很强大,整体来说利大于弊吧。

Q3:Go语言适合做哪些编程应用?
A3:它适合做网络编程,服务器编程,分布式系统,数据库系统,云平台,等。

Q4:可以用传统的面向对象观念理解Go语言的“面向对象”吗?
A4:可以对照理解,但更要超出传统观念,结合Go的设计理念重新理解。

Q5:有什么方法可以快速入坑Go语言吗?
A5:可以先学习官方提供的《A Tour of Go(Go语言之旅)》《Effective Go(实效Go编程)》,再搭配其他书籍视频资料进行深入。

本篇主要是讲一些非常个人的Go语言的学习使用经验哈。目前感觉最熟悉的还是Python,而且熟悉的轮子还挺多的;其他的还有浅尝前端相关的JavaScript/TypeScript、Swift等,接下来提到的内容稍有涉及到它们,不准确的地方还请不吝指出哈~


零,写在前面的话

熟悉Python的你们肯定了解到,它现成的轮子特别多,花较少的时间精力就可以撸出一套相当完整的程序项目。而代价也很明显,就是“慢”,因为语言本身塞了太(令)多(人)方(偷)便(懒)的组件,一跑起大块头的东西来,性能问题立马显现出来了。


优化Python程序项目的路子有很多条,有一条可能会特别吸引你注意的,就是:用Go语言重构项目。

不少Pythoner转向Go语言开发时都说,Go既相对容易上手,写出来的程序又可以比原先用Python写的效率提升很多倍。那Go语言它具体是怎样的呢?真的是Pythoner转型的一道明亮的曙光吗?


一,对Go的第一印象:“天然严格”的程序语言


Go(又称Golang),是一款静态强类型的编译型语言。风格像C语言。语法级别支持并发任务。是Google的开源项目。


那么好奇的你肯定会问,既然像C,为什么还要再造轮子开发新的编程语言呢?


Go最直观的差别是,它是一款“天然严格”的程序语言,对程序员用户有着近乎洁癖的要求(比如用首字母大小写控制是否可见,比如不允许出现没用过的变量名,比如编译时完全没机会见到warning只有必须修好的errors),而这样的要求,的确可以很大程度避免潜在问题,直接“大力出奇迹”提升写出来的程序的健壮性。


跟Python类似的,Go也准备了功能强大的标准库,而与解释型语言Python截然不同的是,作为一款编译型语言,跟C一样当然需要编译运行,不过得益于自身的神优化(可能是自举编译器优化,也可能是根据多种平台指令集编译优化),编译速度飞快。目前Go的标准库可能还不及Python的一半,但提供的标准库每一个都设计得很精湛,很恰到好处,正如语言它本身提供给我们的特性,也是不多不少,恰到好处。


相比给足十分灵活性的Python,Go永远都是优先考虑“简洁”和“健壮”,而宁可损失一部分的灵活性(比如呼声非常高的提案至少10年的终于要在今年发布1.18版本加入的泛型)。毕竟,复杂度越高,自由度越高,不可控的因素会更多,你说是吧?


二,对Go的第二印象:不像Python,而像TypeScript,又像Swift


Go语言的设计理念和优势使它的定位非常明确,它适合做:网络编程,服务器编程,分布式系统,数据库系统,云平台。


Go在语法上具备如今大多数主流语言的特点,但又有其独特之处。比如struct、interface、slice、map、channel的设计特点,比如保留指针但弱化指针的概念并简化用法,比如“零值”的设定,比如switch case不需要break改提供通常不用的fallthough,比如语法级别支持并发任务编程的Goroutine,等等。有变方便的地方,也有变更麻烦的地方,很多具体细节是需要在实际使用中才能深切体会到的。


有句“大实话”:Go代码里有一半的代码量是用来写“if err != nil {}”的!如果你第一次接触到这样的错误处理方式,没有try/catch(except),只有“if err != nil {}”和defer/panic/recover,你可能会感到很抓狂!其实Swift方式的“guard ... else {}”与Go方式的“if err != nil {}”有异曲同工之妙,同样都是“获取某值,值异常则立即做异常处理,否则正常继续”的思路,不同的是Swift方式含义更明确一些,通用性更高一些;而Go这边,通常是函数或者方法设计了多返回值(通常是双返回值),并且约定最后一个值用来返回错误对象,然后才有利用if判断的“if err != nil {}”这种看起来挺蹩脚的写法。


对比之下,Swift方式看起来显然更为优雅,而Go方式这样的设计,觉得可能是为了避免添加太多的语法糖导致增加语言的复杂性吧,“简洁至上”。


正因如此,当你初入Go语言时,总会有一些特性让你感觉很不理解,或者很不习惯。


如果你原本的编程基础是零,即完全没有基础,那么Go并不会是你的入坑首选。因为Go不像Python能隐藏绝大部分初学者需要花时间理解的枯燥的基础知识,而且在第三方模块上,对比丰富的Python PyPI模块仓库,Go第三方包数量目前还比较有限,光这两点就已经无法做到完完全全的“开箱即用”了,很容易让人劝退;也因为,只有尝尽C、Java等其他你接触过的语言的“苦”,才能体会到Go语言带来的“甘”。零基础的你,培养编程兴趣毋庸置疑推荐从Python开始。


如果你原来恰好是一位Pythoner,那上手Go来就会觉得处处受限!明明一两个Python语句可以表达清晰的,为什么需要写这么多呢?Python就算加上“typing/type hints(类型注解)”,也不至于很“啰嗦”的呀。此时面对Go,你需要有足够多的耐心,一点一滴地学习和尝试,逐渐地,逐渐地,会感受到Go强大的代码规范器可以在编译前帮你排查绝大多数的低级错误或者潜在错误,如此一来对比完全允许用户自由发挥的Python开发过程,Go必然使你对自己写出来的程序稳定性信心倍增,不是吗?


如果你原来恰好接触过TypeScript、Swift等其他语言,会发现它们之间既有共同之处,又有大不同。比如TS的interface概念(官方文档传送门:https://www.typescriptlang.org/docs/handbook/interfaces.html)就与Go语言相似,都是以“鸭子类型”思想为基础的产物。Go通过定义interface对具体类型的方法行为进行抽象,利用struct结构体标签推断数据对象的内部结构;类似地,TS通过定义interface的结构,就可以用它来推断object的结构及其方法行为,兼容性比Go高,没有Go那么严格的程度(可能这样更适应网页应用开发)。Swift 4.0新增的Codable也有异曲同工之妙,但主要用于推断数据对象的结构,方便数据的序列化和反序列化的操作,它没有推断方法的作用。

上面提到的“相似”只是冰山一角,利用语言间相似之处可以帮助我们快速上手熟悉新接触的语言,毕竟目前各大主流程序语言都会汲取其他语言的优点融入到自身之中,让自己变得更加强大。


尽管Go语言有强类型要求,尽管有着初学者一时半会难理解参透的struct、interface,但个人感觉Go的实现,已经试图在用户体验和鲁棒性之间寻找最佳平衡点。比如“:=”(声明并赋值)可以隐藏掉大部分的变量类型声明,“go func”就可以轻松实现并行任务的需求,以及神奇的struct结构体标签与Unmarshal(),等等。“严格的”Go相比“自由的”Python,编写高质量代码的过程可能会更加艰难,但这种“艰难”只会是暂时的,尤其是在持续型的项目中,不管是前期开发还是后期维护,优势便会逐渐显现出来。


三、对Go“面向对象”的个人理解:“能力的打包”


如果你阅读过其他开发者朋友的文章经验,可能会读到一些以OOP(俗称“面向对象”)对比学习Go语言的方法。虽然这样的方式并非不可行,但以它深入了解Go语言,我觉得大概率是“方向错了”~


我个人的理解是,Go语言的struct和interface都采用了“Embedding(嵌入)”的方式实现类似“类继承”的特性,但并不是提供一条路让你“换个方式实现类继承”,而是提供一种方式实现“能力的打包”

Go语言中,“package(包)”才是对事物最合适的抽象封装粒度。同个项目中,包与包之间一般是功能隔离、不会产生联系的,只是在main包里面进行功能接口组装。在同个项目中遵循软件工程的方法,在Go语法规范层面上进行适当拆包,可以更快更好地实现“高内聚,低耦合”,进而提升项目整体代码质量。这种分包方式虽然部分类似于Java,但得益于struct和interface本身的语法限制以及“打包能力”的设计,包的复杂程度下降了,耦合度降低了,灵活度顺势增加了。


Go语言更期望你把struct和interface的声明作为同个包里面更小的抽象单位来使用(它处于同个包中,意味着它是提供同种能力中的成分),而不是作为“class(类)”的替代品。


四,官方提供最佳入门教程


如果你对Go语言开始产生兴趣,已经跃跃欲试了,别着急,这里推荐几个官方提供的最快速入门Go语言的资料入口:


另外,推荐一篇以前发布的图文《“鸭子类型”,因吹丝挺! - Python & Go》。

以上,希望对你有所帮助~

『喜欢本篇请不吝点赞,感兴趣后续文章请关注我、关注我的专栏,谢谢您的支持鸭』