Go语言实践[回顾]教程01--为何选择学习使用Go语言

我为什么选择学习使用Go/Golang语言

  每一门开发语言都有自己的优点和不足,当我们决定选择学习使用一门语言的时候,肯定是看中的是其优点,吻合或更接近我们的开发追求,且其存在的缺点是可以接受或可忽略的。

  优缺点都是相对的,但是评价一个语言的优劣是要从多方面全局评价的,且还要针对具体的应用场景,所以这里不会引出“谁是世界上最好的语言”这样的争议话题,只是就个人应用角度阐述一下在特定情况下Go语言的优势、不足以及选择使用Go语言的原因。

  有关Go语言的历史及诞生场景网络上很多介绍,官网也有说明,这里不在赘述。本人是针对以下特点选择学习使用了Go语言。

认为是优点的特点

  下面这些特点是我选择Go语言的主要原因,虽然是相对于其他语言介绍的,但不代表其他语言就不好,各语言的在不同领域不同场景对自己的特点展现是不同的,请勿挑起语言的优劣争夺保卫战!

  1. 真正的编译型语言,Go使用编译器将源代码编译成目标系统的二进制可执行文件(目标系统可直接识别运行的二进制文件),编译后的二进制执行文件可直接运行,不需要解释器,这使运行效率大大提高,这点与C语言一样;
  2. 编译速度超快, 由于使用了智能优化的编译策略,取消了依赖链,使编译速度快到可以用秒计算,很多Go程序基本可以在1秒内完成编译。这就可以在开发时体验到动态语言(解释型)才具备的,边写代码边执行查看效果的优势特点;
  3. 可以交叉编译,可以在一个系统平台上生成另一个系统平台的可执行文件。比如在Windows上编写的代码,要在Linux服务器上运行,不需要在Linux系统上再安装环境生成一遍,而是在Windows系统中直接生成Linux系统下的可执行文件,然后上传到Linux服务器上即可;
  4. 编译时做类型安全性检查, Go语言属于强类型语言,对数据类型的定义要求是严格的。如果一个函数返回的是字符串类型,但是在某处调用时,接收返回值的变量是整数类型,接下来的处理也是按照整数类型进行。这类错误Go语言在编译的时候会自动检查出来,帮助我们捕获这种类型错误;
  5. 使并发编程变得简单,Goroutine(协程)是Go最显著的特征,从根本上解决并发问题。用类似线程的方式处理并发单元,在Runtime(运行时)层面做了深度优化。搭配 channel(通道),将并发单元间的数据耦合拆解开来,各司其职,这对所有纠结于内存共享、锁粒度的开发人员都是一个解脱。使并发编程变得极为容易,只需要一个关键字“Go”,无须处理回调和关注线程切换。
  6. 自动内存分配及垃圾回收,内存分配和垃圾回收是编程中比较头疼的部分,尤其在并发操作的情况下,这将更加困难。Go语言编译器不断在优化这方面的性能,通常情况下我们基本不用考虑内存分配和垃圾回收问题,这些难题都交给编译器去自动化处理了;
  7. 灵活的、无继承的类型系统,不降低性能就能最大程度复用代码。Go语言使用composition(组合)设计模式,只需简单的将一个类型嵌入到另一个类型,就能复用所有的功能。这个类型系统依然可以面向对象,但不使用传统的类,无需考虑如何抽象类和接口,无需考虑继承;在Go语言中,用户可以自定义类型,一个类型由其他更微小类型组合而成,而不是基于继承。
  8. 接口对一组行为建模,接口用于描述类型的行为。Go 语言中对象特性的描述是使用组合实现的。对象内部使用结构体内嵌组合对象,实现应该具有的特性,对外通过接口暴露可以使用的特性行为。一个类型的实例实现了一个接口,则这个实例可以执行一组特定的行为。甚至不需要去声明实例的某个接口,只需要实现这组行为就好,类似其他语言的“鸭子类型”。Go 语言的接口是非侵入式的,接口编写者不必知道接口被哪些类型实现。而接口实现者只需知道要实现什么样的接口,也不必指明实现哪一个接口;
  9. 语法简单、规则严谨,只有25个关键字,去掉了循环、表达式中冗余括号。“++”、“–”从运算符降级为语句,保留指针,但默认阻止指针运算,不再纠结于 i++ 和 ++i,只有i++。强制代码风格,如左括号必须紧接着语句不换行。Go语言提供了一套格式化工具。常见开发环境或者编辑器在保存时,会用格式化工具对代码进行格式化,使代码提交时已经是格式统一;
  10. 强大的标准库,功能完善、质量可靠的标准库是Go语言的一大亮点。Go语言的安装包里提供了一些可以直接使用的包,即标准库(为编程提供充足的动力),提供了清晰的构建模块和公共接口,包含 I/O 操作、文本处理、图像、密码学、网络和分布式应用程序等,并支持许多标准化的文件格式和编解码协议。无需第三方扩展,即可完成大部分基础功能开发,大大降低了学习和使用成本。更关键的是标准库有升级和修复保障,且能从运行时获得深层次优化,这是第三方库无法比拟的。其中最值得一提的是 net/http,仅须简单几条语句就能实现一个高性能 Web Server。
  11. 内置完整的测试框架,仅需要添加很少的代码就可以快速测试一段需求代码,包括单元测试、性能测试、代码覆盖率、数据竞争,以及用来调优的 pprof(性能分析),这为代码能正确而稳定运行提供了方便有力的保障;
  12. 无需安装专用的运行环境,静态链接,只需要编译后的一个可执行文件,无须附加任何东西就能部署,无需事先安装运行环境和下载诸多第三方库。
  13. 对gRPC 和 Protocol Buffers一流的支持,对于构建需要通过 RPC 进行通信的微服务(microservices),这两个工具可以友好的配合实现。定义 RPC 调用发生的情况和参数只需一个清单(manifest),将自动生成服务器及客户端代码。这样生成代码不仅快速,网络占用也更少。
  14. 特点总结:Go语言的主要目标是“兼具 Python 等动态语言的开发速度与易用性和 C/C++ 等编译型语言的性能与安全性”。

可以接受的不足

  1. 比较年轻,后来者居上的例子也不少,这也使得他可以集众家之长,且现在社区发展壮大十分迅猛;
  2. 错误处理不同,Go的错误处理方式与其他语言由很大不同,初学者比较难确定错误发生的范围,需要适应他的处理方式,且相关工具链也在不断优化中;
  3. 整体运行速度还略低于C,但差距在不断的缩小,其实对现在的性能已经很满意;
  4. 分布式计算欠佳,并发已经很高效且独具一格了,分布式相信会逐步完善。

有关Go的一些花边旧闻

  Go(Golang)语言起源于2007年,在2009年正式对外发布。创始人为Ken Thompson、Rob Pike、Robert Griesemer 。
   Ken Thompson:贝尔实验室 Unix 团队成员,C语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 合作设计了 UTF-8 编码方案。
   Rob Pike:Go语言项目的总负责人,贝尔实验室 Unix 团队成员,除合作设计 UTF-8 外,还合作开发了 Plan 9、Inferno 操作系统和 Limbo 编程语言,并与人合著了《The Unix Programming Environment》。
   Robert Griesemer:在Google就职于,参与开发 Java HotSpot 虚拟机,并负责 Chrome 浏览器和 Node.js 使用的 Google V8 JavaScript 引擎的代码生成部分。

  Docker、Go-Ethereum、Thrraform 和 Kubernetes等众多开源项目使用Go语言开发完成的 。

  Go语言的吉祥物,是Go创始人之一 Rob Pike的妻子,由才华横溢的插画家Renee French设计。见下图:

地鼠
.
.
下一节:Go/Golang语言学习实践[回顾]教程02–安装Go语言开发包
.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学为所用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值