我放弃Python转Go语言的9大理由(附优秀书籍推荐)
前言
go大概2009年面世以来,已经8年了,也算是8年抗战。在这8年中,已经有很多公司开始使用go语言开发自己的服务,甚至完全转向go开发,也诞生了很多基于go的服务和应用,比如dokcer、k8s等,很多的大公司也在用,比如google(作为开发go语言的公司,当仁不让)、facebook、腾讯、百度、阿里、京东、小米以及360,当然除了以上提到的,还有很多公司也都开始尝试golang,这其中是什么原因呢?让我们来一起分析分析。
原因 1:性能
go 极其地快。其性能与 java 或 c++相似。在我们的使用中,go 一般比 python 要快 30 倍。
以下是 go 与 java 之间的基准比较:
原因 2:语言性能很重要
对很多应用来说,编程语言只是简单充当了其与数据集之间的胶水。语言本身的性能常常无关轻重。
但是 stream 是一个 api 提供商,服务于世界 500 强以及超过 2 亿的终端用户。数年来我们已经优化了 cassandra、postgresql、redis 等等,然而最终抵达了所使用语言的极限。
原因 3:开发者效率&不要过于创新
看一下绝佳的入门教程《开始学习 go 语言》(http://howistart.org/posts/go/1/)中的一小段代码:
package main type openweathermap struct{} func (w openweathermap) temperature(city string) (float64, error) { resp, err := http.get("http://api.openweathermap.org/data/2.5/weather?appid=your_api_key&q=" + city) if err != nil { return 0, err } defer resp.body.close() var d struct { main struct { kelvin float64 `json:"temp"` } `json:"main"` } if err := json.newdecoder(resp.body).decode(&d); err != nil { return 0, err } log.printf("openweathermap: %s: %.2f", city, d.main.kelvin) return d.main.kelvin, nil }
如果你是一个新手,看到这段代码你并不会感到吃惊。它展示了多种赋值、数据结构、指针、格式化以及内置的 http 库。
当我第一次编程时,我很喜欢使用 python 的高阶功能。python 允许你创造性地使用正在编写的代码,比如,你可以:
- 在代码初始化时,使用 metaclasses 自行注册类别
- 置换真假
- 添加函数到内置函数列表中
- 通过奇妙的方法重载运算符
毋庸置疑这些代码很有趣,但也使得在读取其他人的工作时,代码变得难以理解。
go 强迫你坚持打牢基础,这也就为读取任意代码带来了便利,并能很快搞明白当下发生的事情。
注意:当然如何容易还是要取决于你的使用案例。如果你要创建一个基本的 crud api,我还是建议你使用 django + drf,或者 rails。
原因 4:并发性&通道
go 作为一门语言致力于使事情简单化。它并未引入很多新概念,而是聚焦于打造一门简单的语言,它使用起来异常快速并且简单。其唯一的创新之处是 goroutines 和通道。goroutines 是 go 面向线程的轻量级方法,而通道是 goroutines 之间通信的优先方式。
创建 goroutines 的成本很低,只需几千个字节的额外内存,正由于此,才使得同时运行数百个甚至数千个 goroutines 成为可能。你可以借助通道实现 goroutines 之间的通信。go 运行时间可以表示所有的复杂性。goroutines 以及基于通道的并发性方法使其非常容易使用所有可用的 cpu 内核,并处理并发的 io——所有不带有复杂的开发。相较于 python/java,在一个 goroutine 上运行一个函数需要最小的样板代码。你只需使用关键词「go」添加函数调用:
go 的并发性方法非常容易上手,相较于 node 也很有趣;在 node 中,开发者必须密切关注异步代码的处理。
并发性的另一个优质特性是竞赛检测器,这使其很容易弄清楚异步代码中是否存在竞态条件。下面是一些上手 go 和通道的很好的资源:
- https://gobyexample.com/channels
- https://tour.golang.org/concurrency/2
- http://guzalexander.com/2013/12/06/golang-channels-tutorial.html
- https://www.golang-book.com/books/intro/10
- https://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html
原因 5:快速的编译时间
当前我们使用 go 编写的最大微服务的编译时间只需 6 秒。相较于 java 和 c++呆滞的编译速度,go 的快速编译时间是一个主要的效率优势。我热爱击剑,但是当我依然记得代码应该做什么之时,事情已经完成就更好了。
go 之前的代码编译
原因 6:打造团队的能力
首先,最明显的一点是:go 的开发者远没有 c++和 java 等旧语言多。据知,有 38% 的开发者了解 java,19.3% 的开发者了解 c++,只有 4.6% 的开发者知道 go。github 数据表明了相似的趋势:相较于 erlang、scala 和 elixir,go 更为流行,但是相较于 java 和 c++ 就不是了。
幸运的是 go 非常简单,且易于学习。它只提供了基本功能而没有多余。go 引入的新概念是「defer」声明,以及内置的带有 goroutines 和通道的并发性管理。正是由于 go 的简单性,任何的 python、elixir、c++、scala 或者 java 开发者皆可在一月内组建成一个高效的 go 团队。
原因 7:强大的生态系统
go 有着强大的工具支持,面向 redis、rabbitmq、postgresql、template parsing、task scheduling、expression parsing 和 rocksdb 的稳定的库。
go 的生态系统相比于 rust、elixir 这样的语言有很大的优势。当然,它又略逊于 java、python 或 node 这样的语言,但它很稳定,而且你会发现在很多基础需求上,已经有高质量的文件包可用了。
原因 8:gofmt,强制代码格式
gofmt 是一种强大的命令行功能,内建在 go 的编译器中来规定代码的格式。从功能上看,它类似于 python 的 autopep8。格式一致很重要,但实际的格式标准并不总是非常重要。gofmt 用一种官方的形式规格代码,避免了不必要的讨论。
原因 9:grpc 和 protocol buffers
go 语言对 protocol buffers 和 grpc 有一流的支持。这两个工具能一起友好地工作以构建需要通过 rpc 进行通信的微服务器(microservices)。我们只需要写一个清单(manifest)就能定义 rpc 调用发生的情况和参数,然后从该清单将自动生成服务器和客户端代码。这样产生代码不仅快速,同时网络占用也非常少。
对每位程序员来说,不管哪种语言,“学的扎实,能学以致用”才是王道!本文就为对 go 语言感兴趣的朋友们提供一些口碑不错的学习书籍建议。
一、《go语言学习笔记》
(未找到对应版本的电子书,大家可以去作者github:)
推荐理由:作为时下流行的一种系统编程语言,go 简单易学,性能很好,且支持各类主流平台。已有大量项目采用 go 编写,这其中就包括 docker 等明星作品,其开发和执行效率早已被证明。本书经四年多逐步完善,内容覆盖了语言、运行时、性能优化、工具链等各层面知识。且内容经大量读者反馈和校对,没有明显的缺陷和错误。
适合人群:本书不适合编程初学入门,可供有实际编程经验或正在使用go 工作的人群参考。
二、《go语言实战》
()
推荐理由:william kennedy是一位熟练的软件开发者,也是博客goinggo.net的作者。本书向读者提供一个专注、全面且符合语言习惯的视角。go语言实战同时关注语言的规范和实现,涉及的内容包括语法、类型系统、并发、管道、测试,以及其他一些主题。
适合人群:全覆盖,侧重初学者
三、《go web编程》
()
推荐理由: 《go web编程》介绍如何用go语言进行web应用的开发,将go语言的特性与web开发实战组合到一起,帮读者成功地构建跨平台的应用程序,节省go语言开发web的宝贵时间。有了这些针对真实问题的解决方案放在手边,大多数编程难题都会迎刃而解,读者可以更加方便地找到各种编程问题的解决方案,内容涵盖文本处理、表单处理、session管理、数据库交互、加/解密、国际化和标准化,以及程序的部署维护等运维方面的知识,最后还介绍了一个快速开发的框架帮助您迅速进入go语言的web开发。
适合人群:全覆盖
四、《go语言编程》
()
推荐理由:作者是业界大神级别的人物,七牛云存储团队的核心技术人员,也是国内最早应用和推广 go 语言技术的专家!本书内容简炼,重点突出,将 go 语言的特性做了充分的分析和总结,并给出 go 实例的代码;内容体系可能更适合有一定编程基础的程序员阅读!本书是国内最早的中文版的 go 技术书籍之一,虽然发行时间比较早,但仍可以作为重要参考!电子版和纸质版都有!
适合人群:全覆盖,侧重有经验的程序员
五、《go并发编程实战(第2版)》
()
推荐理由:本书首先介绍了go语言的优秀特性、安装设置方法、工程结构、标准命令和工具、语法基础、数据类型以及流程控制方法,接着阐述了与多进程编程和多线程编程有关的知识,然后重点介绍了goroutine、channel以及go提供的传统同步方法,最后通过一个完整实例——网络爬虫框架进一步阐述go语言的哲学和理念,同时分享作者在多年编程生涯中的一些见解和感悟。
适合人群:适用于有一定计算机编程基础的从业者以及对go语言编程感兴趣的爱好者,非常适合作为go语言编程进阶教程。
六、《go 语言程序设计》
()
推荐理由:国外最经典的go语言著作,go语言编程的先驱者mark summerfield的实践经验总结。这是一本go语言实战指南,帮你了解go语言,按go语言的方式思考,以及使用go语言来编写高性能软件。
作者展示了如何编写充分利用go语言突破性的特性和惯用法的代码,以及go语言在其他语言之上所做的改进,并着重强调了go语言的关键创新。
注重实践教学,每章都提供了多个经过精心设计的代码示例。
由国内第一个核心服务完全采用go语言实现的团队——七牛团队核心成员翻译。
适合人群:适用于有一定go语言编程编程的爱好者,非常适合作为go语言编程进阶教程。
还想要更多学习的书籍!?
看这里↓↓
总结
go 是一种非常高效的语言,高度支持并发性。同时,它也像 c++和 java 一样快。虽然相比于 python 和 ruby,使用 go 建立东西需要更多的时间,但在后续的代码优化上可以节省大量时间。这也是为什么向大家推荐这篇文章的原因。
下一篇: Java学习笔记36(File类)