我为什么选择Go?

1. 博主编程语言学习过程

Visual Basic

我的后端编程语言学习过程,首先接触的Visual Basic,仅限于当时考完二级,而且是一次性通过(当时我们班第一次考过的,就只有两个),天赋我是没有的,有的只是没日没夜的练习吧,想起来那段日子,每天敲代码,做题目,还是很充实的。

C

后来学的c,主要是做嵌入式方面的,偏硬件,51、stm单片机,机器人编程(不是乐高机器人)这些,还参加了中国机器人大赛,后来毕业一年后想考浙大的研究生(最后因为各种原因,还是工作了),又把c拾起来了,用c刷算法。那个时候我还没接触后面的编程语言。

Java

再后来接触了java,当时学的还是不错的,还用java刷算法题,那个时候比较推崇java,然而当我从某兴离职,去了某宁后,当时的项目经理带我用了py,从此一发不可收拾,随着工作的不断深入,真真切切体会到,python简直太方便了!果断放弃了java。

Python

到目前为止,我一直用py居多,写过爬虫,写过自动化测试,写过自动化运维脚本,还参与了云平台后端的部分研发工作等等,真的是在工作中逐渐放飞自己,python真的是太好用了!

Go

上面是我的编程语言学习过程,VB→C→JAVA→PYTHON→GO 随着接触的越多,发现自己的知识广度其实足够了,甚至甩出同龄人几条街,可精度不够,说到这,我想到大学毕业答辩给我打的评语: 知识面较广语言表达能力一般逻辑思维一般

编程语言只是工具,每次去南京图书馆,看了计算机书架上的书,那么多编程语言琳琅满目,看得我有点不知所措,在软件行业也工作了不少年了,发现自己没精通一门语言,一直很“肤浅”在学习,接下来的时间里,打算只选择一门语言作为主要语言,也是未来工作中的语言。我选了Go,辅助语言选了py。精力毕竟是有限的。我认同了Go这门语言,就要适应它的设计思想编程规范语法特点等等。

2. 为什么选go

  • 对初学者足够友善,能够快速上手

    学了一段时间了,这个不敢苟同,还是觉得py写的更顺手,更快。但是相对C,Java之类,Go的真的已经很简化而灵活了,可能是因为写的不够多,继续努力吧,别放弃,熟能生巧。

  • 生产力与性能的最佳结合

    Go在性能方面,没得说,看了官方的数据还有别人跑的对比,以后随着学习和工作的深入,慢慢体会吧。

    Go 能够在保持生产力的同时,大幅度提高性能。比如,全球知名的非营利教育组织可汗学院从 2019 年末开始,就将其在线教育平台的实现从 Python 迁移到了 Go。虽然 Go 代码行数要多于 Python,但他们收获了近 10 倍的性能提升。同样,知乎也是,后端由py迁移到了Go,节省了大量服务器。

  • 快乐又有“钱景”

之所以选择go,一方面想选一门语言深入下去,不想那么杂了。精通一门,自己比较感兴趣的,Go和Python,而Py虽然我在工作中的多,但还是希望自己能够学习一门静态的编译型语言,权衡之下,选了Go。

3. Go的设计哲学

简单显式组合并发面向工程

  • 简单是指 Go 语言特性始终保持在少且足够的水平,不走语言特性融合的道路,但又不乏生产力。简单是 Go 生产力的源泉,也是 Go 对开发者的最大吸引力;
  • 显式是指任何代码行为都需开发者明确知晓,不存在因“暗箱操作”而导致可维护性降低和不安全的结果;
  • 组合是构建 Go 程序骨架的主要方式,它可以大幅降低程序元素间的耦合,提高程序的可扩展性和灵活性;
  • 并发是 Go 敏锐地把握了 CPU 向多核方向发展这一趋势的结果,可以让开发人员在多核时代更容易写出充分利用系统资源、支持性能随 CPU 核数增加而自然提升的应用程序;
  • 面向工程是 Go 语言在语言设计上的一个重大创新,它将语言要解决的问题域扩展到那些原本并不是由编程语言去解决的领域,从而覆盖了更多开发者在开发过程遇到的“痛点”,为开发者提供了更好的使用体验。

4. Go语言语法

Go 语法层面上呈现了这样的状态:

  • 仅有 25 个关键字,主流编程语言最少;
  • 内置垃圾收集,降低开发人员内存管理的心智负担;
  • 首字母大小写决定可见性,无需通过额外关键字修饰
  • 变量初始为类型零值,避免以随机值作为初值的问题;
  • 内置数组边界检查,极大减少越界访问带来的安全隐患;
  • 内置并发支持,简化并发程序设计;内置接口类型,为组合的设计哲学奠定基础;原生提供完善的工具链,开箱即用;… …

在 Go 语言最初设计阶段就将解决工程问题作为 Go 的设计原则之一去考虑 Go 语法、工具链与标准库的设计,这也是 Go 与其他偏学院派、偏研究型的编程语言在设计思路上的一个重大差异。

语法是编程语言的用户接口,它直接影响开发人员对于这门语言的使用体验。在面向工程设计哲学的驱使下,Go 在语法设计细节上做了精心的打磨。比如:

  • 重新设计编译单元和目标文件格式,实现 Go 源码快速构建,让大工程的构建时间缩短到类似动态语言的交互式解释的编译速度;
  • 如果源文件导入它不使用的包,则程序将无法编译。这可以充分保证任何 Go 程序的依赖树是精确的。这也可以保证在构建程序时不会编译额外的代码,从而最大限度地缩短编译时间;
  • 去除包的循环依赖,循环依赖会在大规模的代码中引发问题,因为它们要求编译器同时处理更大的源文件集,这会减慢增量构建;
  • 包路径是唯一的,而包名不必唯一的。导入路径必须唯一标识要导入的包,而名称只是包的使用者如何引用其内容的约定。“包名称不必是唯一的”这个约定,大大降低了开发人员给包起唯一名字的心智负担;
  • 故意不支持默认函数参数。因为在规模工程中,很多开发者利用默认函数参数机制,向函数添加过多的参数以弥补函数 API 的设计缺陷,这会导致函数拥有太多的参数,降低清晰度和可读性;
  • 增加类型别名(type alias),支持大规模代码库的重构。

5. gofmt

值得重点介绍的是 gofmt,它统一了 Go 语言的代码风格,在其他语言开发者还在为代码风格争论不休的时候,Go 开发者可以更加专注于领域业务中。同时,相同的代码风格让以往困扰开发者的代码阅读、理解和评审工作变得容易了很多,至少 Go 开发者再也不会有那种因代码风格的不同而产生的陌生感。Go 的这种统一代码风格思路也在开始影响着后续新编程语言的设计,并且一些现有的主流编程语言也在借鉴 Go 的一些设计。

6. 标准库

规模代码库的重构。在标准库方面,Go 被称为“自带电池”的编程语言。如果说一门编程语言是“自带电池”,则说明这门语言标准库功能丰富,多数功能不需要依赖外部的第三方包或库,Go 语言恰恰就是这类编程语言。再也不需要像python那样少包的话各种pip install了。

由于诞生年代较晚,而且目标比较明确,Go 在标准库中提供了各类高质量且性能优良的功能包,其中的net/httpcryptoencoding等包充分迎合了云原生时代的关于 API/RPC Web 服务的构建需求,Go 开发者可以直接基于标准库提供的这些包实现一个满足生产要求的 API 服务,从而减少对外部第三方包或库的依赖,降低工程代码依赖管理的复杂性,也降低了开发人员学习第三方库的心理负担。

而且,开发人员在工程过程中肯定是需要使用工具的,Go 语言就提供了足以让所有其它主流语言开发人员羡慕的工具链,工具链涵盖了编译构建代码格式化包依赖管理静态代码检查测试文档生成与查看性能剖析语言服务器运行时程序跟踪等方方面面。

posted @ 2022-08-28 10:44  sunnybowen  阅读(31)  评论(0编辑  收藏  举报