Go 语言学习技巧和编程思维

Go 语言学习技巧和编程思维

一、了解 Go 语言

了解 Go 语言背景

学习 Go 语言,首先要了解 Go 语言,Go 是于 2009 年 11 月开源,然后最终在 2012 年上半年的时候发布了 Go 1.0 稳定版本,主要是由 Google 主导开发。目前 Go 有一个非常活跃的社区,现在很多互联网公司的后端开发很多都是用 Go 语言开发了,当然了,这个目前还动摇不了 Java 的统治地位。

Go 发展势头这么快,更多的是得益于云原生,因为当前阶段云原生已经是风生水起,而云原生相关系统的实现,绝大多数都是 Go 来实现的,比如 K8s、Istio、Docker、Etcd 等。

探讨 Go 的未来

我们去看一种语言能不能有一个好的未来,主要看如下几点:

  • 社区是否活跃和丰富、开发者们是否能够接收社区的一些建议。目前发展势头较好的语言,比如 Java、C/C++ 社区一定是非常活跃的,参与的人数会非常多,并且也能很好的和社区进行交换意见。
  • 是否有一些工业化的标准。像 C/C++、Java 这些编程语言都是有标准化组织的。尤其是 Java,它在架构上还搞出了像 J2EE 这样的企业级标准。
  • 是否有一些重量级的应用项目。常见发展好的语言一定都是有大量的重量级项目的。
  • 是否有重量级人物或者公司牵头。
  • 是否容易上手。

对比来看,Go 目前的社区非常活跃,主要由 Google 牵头,并且能够很好的接收社区的意见并且进行优化改进,并且目前很多大公司内部也都大量使用 Go,整体语言非常简单易懂,并且开发效率高,而 Go 语言的重量级应用比如 Kubernetes 、Istio 、Docker 都是目前火爆的不行的。所以, Go 的未来是非常可观的。但是,Go 也不至于会让其他语言都无处容身,Go 更多的会在云原生相关领域,以及 PaaS 层的相关领域上有绝对性的优势,后续的一些后端中间的基础组件可能大多数都会使用 Go 来开发了。

二、Go 语言学习技巧

了解各语言的优缺点

对技术人员而言,学习一门新语言,必然需要掌握这门语言的一些优缺点,以及其他类似语言的优缺点,有对比才能让你更快的理解这门语言

Go 语言的优缺点

  • Go 优点:学习门槛低,非常简单直接,表达力很强,并且语言特定比较稳定,社区活跃,基本上想要的一些组件或者通用库,都能在官方包或者 github 上找到。不用关心内存分配和释放,gc 会帮我们处理。并且还可以兼容 C ,不过,一般实际应用中很少会使用兼容 C 的使用姿势,要么纯 Go、要么纯 C。Go 另外一个比较大的优势在于支持协程,可以非常快速的写出并发高的代码,Go 的并发非常简单。Go 在以前的版本最受大家诟病的泛型,也在 Go1.18 开始支持了,这个算的上是他的一个优点了。

  • Go 缺点:目前在兼容 C 的情况下的高并发的支持上做的还不够好。目前 Go 基本只能应用在后端开发,无法应用在客户端的开发,也很少有在 PC 端的开发。当然,有一些语法和习惯比较让人诟病,比如 err 的处理,但是习惯了以后,其实感觉还好。

C/C++ 语言的优缺点

  • C/C++ 的优点:功能强大,性能高,C 相对简单点,C++ 会比 C 复杂很多。很多底层的一些实现都是 C/C++,因为 C/C++ 更偏向底层,历史悠久,早些年的大学学的大多数是 C/C++ 语言,社区资源丰富。搞 C++ 厉害的都是大神。
  • C/C++ 的缺点:指针非常灵活,很多人用不好,相对来说要用好 C 的话门槛还是比较高,尤其是 C++ 的门槛。另外一方面是需要自己手动管理内存的申请和分配,一不小心就会内存泄漏或者段指针错误。

Jave 语言的优缺点

  • Java 优点:程序员最多,社区资源丰富。内存管理基于 GC,和 Go 一样,不用自己管理,这大大减少了使用的心智负担。基于 VM 字节码,天然提供了跨平台的插件机制。
  • Java 缺点:强 OO 流派,表达上有些死板,不够活泼(不是灵活)。

Go 语言学习技巧和步骤

  1. 了解 Go 的一些基本情况后,接下来我们看看怎么学习 Go。学习 Go 首先,要把 Go 的基本语法弄清楚,这个可以看一些入门的书籍,把 Go 的基础数据结构有个大致了解。
  1. 通读 Go 的一些好的文章如 Frequently Asked Questions (FAQ)或者看看 FAQ 的中文翻译 ,主要是了解 Golang 的全貌。
  1. 关注 Go 语言的编码规范,任何一门语言,一定要注重它既有的编码规范和惯用法。首先需要了解 Go 官方的编码规范,主要是要参考官方的 CodeReviewCommentsEffective Go 这两篇官方文章,真的非常推荐必须要好好的看完、看懂这两篇文章(英文不好的同学可以看中文翻译文档),然后按照官方编码规范来具体 coding。规范的目的主要是能够在具体的编码中有迹可循, 一般的大公司,都会有内部的编码规范,内部的 Go 编码规范也是再官方的基础上做一些优化或者定制。
  1. 有了基本语法,有了编码规范,那么接下来就需要我们去参考业界大牛们的代码,主要是看一些开源的优质的项目,比如 Google 他们这帮人自己搞的 Kubernetes、Istio,还有一些好的项目如 Docker、CoreDNS、etcd 等等,具体要看这些东西:

    • 项目基本架构的组织
    • 代码基本的编码封装
    • 代码的基本原则规范
    • 并发的设计思想
    • 面向对象编程的设计思想
    • 可扩展性的设计思想
  2. 最后就是要动手实践,实实在在的跑一些代码示例,一般我的习惯是自己建立一个 base-code 的项目,里面就是我们的各种 example 示例,然后进行一些修改、执行。具体的代码示例可以从官方文档上来,推荐Go by Example,里面有大量非常好的例子。也可以自己网上随便搜下,重要的自己要修改并执行,查看和分析结果,然后再 Go 101这里有各个语法的使用和介绍

三、Go 语言价值观和编程思维

编程语言会影响编程思维,对于 Go,最重要的思维就是并发思维,因此,学习 Go,就要用 Go 的编程思维去写 Go 代码,而不是用其他语言的思维方式【Golang coding in go way】。

Go 语言的初衷就是为了解决好 Google 内部大规模高并发服务的问题,主要核心就是围绕高并发来开展;并且同时又不想引入面向对象那种很复杂的继承关系。所以,这正是 Go 编程思维的来源。

  1. Go 天生就是可以方便的解决好并发问题(包括高并发),那么就需要有并发思维,能够并发处理就通过并发来进行任务分配

    • 这里就涉及到了 context、 goroutine、channel(select) 等的原理和设计,虽然,在 Go 里面可以创建大量 goroutine, 但是,一般我们都需要能通过 context、 channel 建立 "父子"关系,用来控制其生命周期,保证子任务可以能够被回收、被主动控制(如 杀死)
  2. 需要有面向对象编程思想,利用好 interface、 struct 来实现继承、多态的用法

    • struct 匿名组合来实现继承
    • interface 和 struct 来实现多态
    • interface 定义接口,尽可能的保持里面的方法定义简单,然后多个 interface 进行组合
  3. 理解 Go 语言的一些独有特性和惯用法:

    • 按照官方和内部的编码规范来使用,熟悉它的各种惯用法
    • 强类型,语法上要注意处理
    • 一定要关注 GC,实际中要观察 GC 日志并做好分析
    • Go 是有 Runtime 的,所以得了解 Runtime 的原理和运行机制
  1. 理解 Go 语言的价值观

    • 价值观 1:尽可能的简单
      • 语法语义尽可能的简单、保持各种类型定义尽可能精简
      • 短命名思维,在不影响可读性的前提下,尽可能的用长度短小的标识符,一个例子就是 for i, u := range users {
    • 价值观 2:进行正交组合,优先考虑组合,而不是常见 OO 语言的继承方式
      • Go 语言通过类型的垂直组合而不是继承让单一类型可以承载更多的功能
      • interface 尽可能的保持职责单一并且接口里面的方法不要过多
    • 价值观 3:大胆使用并发,Go 是为并发而生的(Goroutine 机制)
  2. 从 Golang 社区的一些最佳实践来看,Golang 的各种组件也需要尽可能的精简。

    • Golang 中用好的一些开源组件库,都是比较轻量级的,然后可以各自随意组合来达到最佳实践。
    • 我们自己进行组件封装、模块封装的时候,也是保持这个原则,尽可能的精简,然后使用方进行组合。

参考

Go coding in go way

最后

这篇文章首发在我微信公众号【后端系统和架构】中,点击这里可以去往公众号查看原文链接,如果对你有帮助,欢迎前往关注,更加方便快捷的接收最新优质文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容