为什么说2017年你必须学Go语言了?

Posted 异步图书

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么说2017年你必须学Go语言了?相关的知识,希望对你有一定的参考价值。



参与文末每日话题讨论,赠送异步新书

为什么说2017年你必须学Go语言了?  

   异步图书君


2017年9月,Go语言诞生十周年,Go语言之父,来自谷歌的编程大神Rob Pike在自己的博客中发表了文章《Go语言发展中的十年》来纪念Go语言十周岁生日同时讲述了从诞生到发展的历程。2017年必须要学习Go语言了,我们来一看究竟。

知乎网友是如何回复的?

链接:https://www.zhihu.com/question/21409296/answer/18184584

我尝试来回答你几个问题:
1、Go有什么优势

  • 可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了。

  • 静态类型语言,但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高。

  • 语言层面支持并发,这个就是Go最大的特色,天生的支持并发,我曾经说过一句话,天生的基因和整容是有区别的,大家一样美丽,但是你喜欢整容的还是天生基因的美丽呢?Go就是基因里面支持的并发,可以充分的利用多核,很容易的使用并发。

  • 内置runtime,支持垃圾回收,这属于动态语言的特性之一吧,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况,特别是Go1.1之后的GC。

  • 简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。

  • 丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大,我最爱的也是这部分。

  • 内置强大的工具,Go语言里面内置了很多工具链,最好的应该是gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难。

  • 跨平台编译,如果你写的Go代码不包含cgo,那么就可以做到window系统编译linux的应用,如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息。

  • 内嵌C支持,前面说了作者是C的作者,所以Go里面也可以直接包含c代码,利用现有的丰富的C库。

2、Go适合用来做什么

  • 服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。

  • 分布式系统,数据库代理器等

  • 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用、

  • 内存数据库,前一段时间google开发的groupcache,couchbase的部分组建

  • 云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的apcera云平台。

3、Go成功的项目
nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息
docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。
packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者
skynet:分布式调度框架
Doozer:分布式同步工具,类似ZooKeeper
Heka:mazila开源的日志处理系统
cbfs:couchbase开源的分布式文件系统
tsuru:开源的PAAS平台,和SAE实现的功能一模一样
groupcache:memcahe作者写的用于Google下载系统的缓存系统
god:类似redis的缓存系统,但是支持分布式和扩展性
gor:网络流量抓包和重放工具
以下是一些公司,只是一小部分:

  • Juju at Canonical/Ubuntu, presentation

  • at Beachfront Media

  • CloudFlare

  • Soundcloud

  • Mozilla

  • Disqus

  • Heroku

  • google

  • youtube

下面列出来了一些使用的用户

4、Go还存在的缺点
以下缺点是我自己在项目开发中遇到的一些问题:

  • Go的import包不支持版本,有时候升级容易导致项目不可运行,所以需要自己控制相应的版本信息

  • Go的goroutine一旦启动之后,不同的goroutine之间切换不是受程序控制,runtime调度的时候,需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了,突然冒出来又执行了,会导致逻辑出错等情况。

  • GC延迟有点大,我开发的日志系统伤过一次,同时并发很大的情况下,处理很大的日志,GC没有那么快,内存回收不给力,后来经过profile程序改进之后得到了改善。

  • pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱

最后还是建议大家学习Go,这门语言真的值得大家好好学习,因为它可以做从底层到前端的任何工作。


链接:https://www.zhihu.com/question/21409296/answer/18145585



知乎大部分项目是 Python 写的,有几个小项目是用 Go 写的。我从一个 Python 为主的开发者的角度说说对 Go 的优点的体会吧:

1. 部署简单。Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。这和 Python 有着巨大的区别。由于历史的原因,Python 的部署工具生态相当混乱【比如 setuptools, distutils, pip, buildout 的不同适用场合以及兼容性问题】。官方 PyPI 源又经常出问题,需要搭建私有镜像,而维护这个镜像又要花费不少时间和精力。 

2.并发性好。Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个 Go 应用也能有效的利用多个 CPU 核,并行执行的性能好。这和 Python 也是天壤之比。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁 GIL 的原因,多线程的 Python 程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的 multiprocessing 包又会对监控和管理造成不少的挑战【我们用的 supervisor 管理进程,对 fork 支持不好】。部署 Python 应用的时候通常是每个 CPU 核部署一个应用,这会造成不少资源的浪费,比如假设某个 Python 应用启动后需要占用 100MB 内存,而服务器有 32 个 CPU 核,那么留一个核给系统、运行 31 个应用副本就要浪费 3GB 的内存资源。

3.良好的语言设计。从学术的角度讲 Go 语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go 的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是 Go 自带完善的工具链,大大提高了团队协作的一致性。比如 gofmt 自动排版 Go 代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行 gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码。此外还有 gofix, govet 等非常有用的工具。 

4.执行性能好。虽然不如 C 和 Java,但通常比原生 Python 应用还是高一个数量级的,适合编写一些瓶颈业务。内存占用也非常省。

学习Go,我推荐几个书单:

为什么说2017年你必须学Go语言了?


Go语言领域技术专家力作 关注语言的规范和实现 为读者提供一个专注 全面且符合语言习惯的视角

试读:

购书:


最后要推荐一下《Go Web编程》

无论是经验老到的gopher,还是刚开始接触Go语言的Web开发者,这都是必不可少的一本书,本书囊括了关于Go Web应用的开发和部署的全部知识 

试读:

购书:


本书目录:(滑动手机查看)

第一部分 Go与Web应用 
第1章 Go与Web应用  3 
1.1 使用Go语言构建Web应用  3 
1.1.1 Go与可扩展Web应用  4 
1.1.2 Go与模块化Web应用  4 
1.1.3 Go与可维护的Web应用  5 
1.1.4 Go与高性能Web应用  5 
1.2 Web应用的工作原理  6 
1.3 HTTP简介  7 
1.4 Web应用的诞生  8 
1.5 HTTP请求  9 
1.5.1 请求方法  10 
1.5.2 安全的请求方法  11 
1.5.3 幂等的请求方法  11 
1.5.4 浏览器对请求方法的支持  11 
1.5.5 请求首部  12 
1.6 HTTP响应  13 
1.6.1 响应状态码  13 
1.6.2 响应首部  14 
1.7 URI  15 
1.8 HTTP/2简介  16 
1.9 Web应用的各个组成部分  16 
1.9.1 处理器  17 
1.9.2 模板引擎  18 
1.10 Hello Go  18 
1.11  小结  21 

第2章  ChitChat论坛  23 
2.1 ChitChat简介  23 
2.2 应用设计  24 
2.3 数据模型  26 
2.4 请求的接收与处理  27 
2.4.1 多路复用器  27 
2.4.2 服务静态文件  29 
2.4.3 创建处理器函数  29 
2.4.4 使用cookie进行访问控制  30 
2.5 使用模板生成html响应  33 
2.6 安装PostgreSQL  38 
2.6.1 在Linux或FreeBSD系统上安装  38 
2.6.2 在Mac OS X系统上安装  39 
2.6.3 在Windows系统上安装  39 
2.7 连接数据库  39 
2.8 启动服务器  44 
2.9 Web应用运作流程回顾  45 
2.10 小结  46 

第二部分 Web应用的基本组成部分 
第3章  接收请求  49 
3.1 Go的net/http标准库  49 
3.2 使用Go构建服务器  51 
3.2.1 Go Web服务器  51 
3.2.2 通过HTTPS提供服务  53 
3.3 处理器和处理器函数  56 
3.3.1 处理请求  56 
3.3.2 使用多个处理器  58 
3.3.3 处理器函数  59 
3.3.4 串联多个处理器和处理器函数  61 
3.3.5 ServeMux和DefaultServeMux  65 
3.3.6 使用其他多路复用器  66 
3.4 使用HTTP/2  68 
3.5 小结  70 

第4章  处理请求  72 
4.1 请求和响应  72 
4.1.1 Request结构  73 
4.1.2 请求URL  73 
4.1.3 请求首部  74 
4.1.4 请求主体  76 
4.2 Go与HTML表单  77 
4.2.1 Form字段  79 
4.2.2 PostForm字段  80 
4.2.3 MultipartForm字段  81 
4.2.4 文件  83 
4.2.5 处理带有JSON主体的POST请求  85 
4.3 ResponseWriter  86 
4.4 cookie  91 
4.4.1 Go与cookie 91 
4.4.2 将cookie发送至浏览器  92 
4.4.3 从浏览器里面获取cookie  94 
4.4.4 使用cookie实现闪现消息  96 
4.5 小结  99 

第5章  内容展示  100 
5.1 模板引擎  100 
5.2 Go的模板引擎  102 
5.2.1 对模板进行语法分析  104 
5.2.2 执行模板  105 
5.3 动作  106 
5.3.1 条件动作  106 
5.3.2 迭代动作  108 
5.3.3 设置动作  109 
5.3.4 包含动作  111 
5.4 参数、变量和管道  113 
5.5  函数  114 
5.6 上下文感知  116 
5.6.1 防御XSS攻击  119 
5.6.2 不对HTML进行转义  121 
5.7 嵌套模板  122 
5.8 通过块动作定义默认模板  126 
5.9 小结  127 

第6章  存储数据  128 
6.1 内存存储  128 
6.2 文件存储  131 
6.2.1 读取和写入CSV文件  133 
6.2.2 gob包  135 
6.3 Go与SQL  137 
6.3.1 设置数据库  138 
6.3.2 连接数据库  140 
6.3.3 创建帖子  142 
6.3.4 获取帖子  144 
6.3.5 更新帖子  145 
6.3.6 删除帖子  145 
6.3.7 一次获取多篇帖子  146 
6.4 Go与SQL的关系  147 
6.4.1 设置数据库  147 
6.4.2 一对多关系  150 
6.5 Go与关系映射器  152 
6.5.1 Sqlx  152 
6.5.2 Gorm  154 
6.6 小结  157 

第三部分 实战演练 
第7章  Go Web服务  161 
7.1 Web服务简介  161 
7.2 基于SOAP的Web服务简介  163 
7.3 基于REST的Web服务简介  166 
7.3.1 将动作转换为资源  168 
7.3.2 将动作转换为资源的属性  169 
7.4 通过Go分析和创建XML  169 
7.4.1 分析XML  169 
7.4.2 创建XML  177 
7.5 通过Go分析和创建JSON  180 
7.5.1 分析JSON  181 
7.5.2 创建JSON  184 
7.6 创建Go Web服务  187 
7.7 小结  194 

第8章  应用测试  196 
8.1 Go与测试  196 
8.2 使用Go进行单元测试  197 
8.2.1 跳过测试用例  201 
8.2.2 以并行方式运行测试  202 
8.2.3 基准测试  203 
8.3 使用Go进行HTTP测试  206 
8.4 测试替身以及依赖注入  210 
8.5 第三方Go测试库  217 
8.5.1 Gocheck测试包简介  217 
8.5.2 Ginkgo测试框架简介  223 
8.6 小结  228 

第9章  发挥Go的并发优势  230 
9.1 并发与并行的区别  230 
9.2 goroutine  232 
9.2.1 使用goroutine  232 
9.2.2 goroutine与性能  235 
9.2.3 等待goroutine  238 
9.3 通道  239 
9.3.1 通过通道实现同步  240 
9.3.2 通过通道实现消息传递  242 
9.3.3 有缓冲通道  243 
9.3.4 从多个通道中选择  244 
9.4 在Web应用中使用并发  247 
9.4.1 创建马赛克图片  248 
9.4.2 马赛克图片Web应用  251 
9.4.3 并发版马赛克图片生成Web应用  254 
9.5 小结  262 

第10章  Go的部署  263 
10.1 将应用部署到独立的 服务器  264 
10.2 将应用部署到 Heroku  270 
10.3 将应用部署到Google App Engine  273 
10.4 将应用部署到 Docker  278 
10.4.1 什么是Docker  278 
10.4.2 安装Docker  279 
10.4.3 Docker的理念与 组件  280 
10.4.4 Docker化一个Go Web 应用  281 
10.4.5 将Docker容器推送至 互联网  283 
10.5 部署方法之间的 对比  286 
10.6 小结  287 
附录  安装和设置Go  288 

延伸推荐

点击关键词阅读更多新书:

||||||

异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步图书一本。赶紧来参加哦!



扫一扫上方二维码,回复“关注”参与活动!



点击阅读原文,购买《Go Web编程》

以上是关于为什么说2017年你必须学Go语言了?的主要内容,如果未能解决你的问题,请参考以下文章

为什么说 2017 年你必须要学习 Go 了(多核,网络,多人协作,简单非OO,没有注解,Native,垃圾收集,代码优雅),附两个评论

2017年你应该了解的函数式编程

2017 年你应该学习的编程语言框架和工具

2017 年你应该学习的编程语言框架和工具

go语言完虐java,为什么学go语言你真的清楚吗?

Python太卷了,准备学习Go语言了