GO 语言简介
引用 wiki Go - 维基百科(wikipedia.org)
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
罗伯特·格瑞史莫、罗勃·派克及肯·汤普逊于2007年9月开始设计Go稍后伊恩·兰斯·泰勒(Ian Lance Taylor)、拉斯·考克斯(Russ Cox)加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,支持Linux、macOS、Windows等操作系统。
在2016年,Go被软件评价公司TIOBE选为“TIOBE 2016年最佳语言”
目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。
Q & A
- 问:既有的语言很多,为何还要设计Go语言?
- 答:设计Go语言是因为Java和C++ 等传统语言繁琐、缓慢而难以理解。Go语言的设计者借鉴了Python动态类型语言的优点,旨在打造一款易于使用并可用于开发高流量生产系统的语言。
- 问:编译器生成的可执行文件很大,但源代码文件很小。为何会这样?
- 答:在编译器生成的二进制文件中,必须包含执行程序所需的一切。这带来的缺点是二进制文件比源代码文件大,但优点是无须安装依赖就能运行程序。
主要应用场景
分布式应用
Golang 是非常适合在分布式应用场景下开发的。分布式应用的主要目的是尽可能多的利用计算资源和网络带宽,以求最大化系统的整体性能和效率,其中重要的需求功能就是并发(Concurrency)。而 Go 是支持高并发和异步编程方面的佼佼者。前面已经提到,Go 语言内置了协程(Goroutine)* 和通道(Channel)两大并发特性,这使后端开发者进行异步编程变得非常容易。Golang 中还内置了 sync
库 ,包含 Mutex
(互斥锁)、 WaitGroup
(等待组)、 Pool
(临时对象池)等接口,帮助开发者在并发编程中能更安全的掌控 Go 程序的并发行为。Golang 还有很多分布式应用开发工具*,例如分布式储存系统(Etcd、SeaweedFS)、RPC 库(gRPC、Thrift)、主流数据库 SDK(mongo-driver、gnorm、redigo)等。这些都可以帮助开发者有效的构建分布式应用。
网络爬虫
稍微了解网络爬虫的开发者应该会听说过 Scrapy,再不济也是 Python。市面上关于 Python 网络爬虫的技术书籍数不胜数,例如崔庆才的《Python 3 网络开发实战》和韦世东的《Python 3 网络爬虫宝典》。用 Python 编写的高性能爬虫框架 Scrapy,自发布以来一直是爬虫工程师的首选。
不过,由于近期 Go 语言的迅速发展,越来越多的爬虫工程师注意到用 Golang 开发网路爬虫的巨大优势。其中,用 Go 语言编写的 Colly 爬虫框架,如今在 Github 上已经有 13k+ 标星。其简洁的 API 以及高效的采集速度,吸引了很多爬虫工程师,占据了爬虫界一哥 Scrapy 的部分份额。前面已经提到,Go 语言内置的并发特性让严重依赖网络带宽的爬虫程序更加高效,很大的提高了数据采集效率。另外,Go 语言作为静态语言,相对于动态语言 Python 来说有更好的约束下,因此健壮性和稳定性都更好。
后端 API
Golang 有很多优秀的后端框架,它们大部分都非常完备的支持了现代后端系统的各种功能需求:RESTful API、路由、中间件、配置、鉴权等模块。而且用 Golang 写的后端应用性能很高,通常有非常快的响应速度。笔者曾经在开源爬虫管理平台 Crawlab 中用 Golang 重构了 Python 的后端 API,响应速度从之前的几百毫秒优化到了几十毫秒甚至是几毫秒,用实践证明 Go 语言在后端性能方面全面碾压动态语言。Go 语言中比较知名的后端框架有 Gin、Beego、Echo、Iris。
Golang非常适合用来做网络并发方面的服务,比如消息推送、监控、容器等。国内外的很多著名公司都使用了Go语言来开发服务及应用,比如:
- Google最核心的搜索和广告业务;
- 腾讯的Docker容器化
- 百度的运维BFE(Baidu Front End)项目,应对庞大的前端页面访问量。
- 小米的运维监控系统,小米商城、小米视频等团队也在使用Go语言
优缺点概述
前面介绍了 Go 的语言特性,想必已经对 Golang 有了一些基本的了解。其中的一些语言特性也暗示了它相对于其他编程语言的优缺点。Go 语言虽然现在很火,在称赞并拥抱 Golang 的同时,不得不了解它的一些缺点。
特性 | 优点 | 缺点 |
---|---|---|
语法简单 | 提升开发效率,节省时间 | 难以处理一些复杂的工程问题 |
天然支持并发 | 极大减少异步编程的难度,提高开发效率 | 不熟悉通道和协程的开发者会有一些学习成本 |
类型系统 | Go 语言是静态类型,相对于动态类型语言更稳定和可预测IOP 鸭子类型比严格的 OOP 语言更简洁 | 没有继承、抽象、静态、动态等特性 ; 缺少泛型,导致灵活性降低;难以快速构建复杂通用的框架或工具 |
错误处理 | 强制约束错误管理,避免 “try/catch 一把梭” | 啰嗦的错误处理代码,充斥着 if err := ... |
编译迅速 | 这绝对是一个优点 | 怎么可能是缺点? |
非常规依赖管理 | 可以直接引用发布到 Github 上的仓库作为模块依赖引用,省去了依赖托管的官方网站;可以随时在 Github 上发布 Go 语言编写的第三方模块;自由的依赖发布意味着 Golang 的生态发展将不受官方依赖托管网站的限制 | 严重依赖 Github,在 Github 上搜索 Go 语言模块相对不精准 |
非常规日期格式 | 按照 6-1-2-3-4-5(2006-01-02 15:04:05),相对来说比较好记 | 对于已经习惯了 yyyy-MM-dd HH:mm:ss 格式的开发者来说非常不习惯 |
总结
GO 语言虽然年轻,但是因为其优秀的设计以及背靠 Google大山,收到了众多开发者们的青睐,如果你对 后端开发、网络爬虫等方面开发有兴趣的话,建议了解一下。
《Go语言精进之路:从新手到高手的编程思想、方法和技巧 》
好了,今天的内容就到分享这里啦,很享受与大家一起学习,沟通交流问题,如果喜欢的话,请为我点个赞吧 !👍
作者:chenuvi