`
大涛学长
  • 浏览: 105495 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Go 开发关键技术指南 | 为什么你要选择 GO?(内含超全知识大图)

go 
阅读更多
> **导读**:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 1 篇。

Go 开发指南大图
=========

![2.png](https://ucc.alicdn.com/pic/developer-ecology/c8900314aed843d4b987996254fdd3ea.png)

Overview
========

该指南主要讨论了服务器领域常见的并发问题,也涉及到了工程化相关的问题,还整理了 C 背景程序员对于 Go 的 GC 以及性能的疑问,探讨了 Go 的错误处理和类型系统最佳实践,以及依赖管理的难处、接口设计的正交性,当然也包含我们在服务器开发中对于 Go 实践的总结,有时候也会对一些有趣的问题做深度的挖掘,列出了 Go 重要的事件和资料集合,以及 Go2 的进展和思考。

以下是各个章节以及简介:

*   **About the Name**:为何 Go 有时候也叫 Golang?
*   **Why Go**:为何要选择 Go 作为服务器开发的语言?是冲动?还是骚动?
*   **Milestones**:Go 的重要里程碑和事件,当年吹的那些牛逼,都实现了哪些?
*   **GC**:Go 的 GC 靠谱吗?Twitter 说相当的靠谱,有图有真相。
*   **Could Not Recover**:君可知,有什么 panic 是无法 recover 的?包括超过系统线程限制,以及 map 的竞争写。当然一般都能 recover,比如 Slice 越界、nil 指针、除零、写关闭的 chan 等。
*   **Declaration Syntax**:为何 Go 语言的声明语法是那样的?C 语言的声明语法又是怎样的?是拍的大腿,还是拍的脑袋?
*   **Errors**:为什么 Go2 的草稿 3 个中有 2 个是关于错误处理的?好的错误处理应该怎么做?错误和异常机制的差别是什么?错误处理和日志如何配合?
*   **Logger**:为什么标准库的 Logger 是完全不够用的?怎么做日志切割和轮转?怎么在混成一坨的服务器日志中找到某个连接的日志?甚至连接中的流的日志?怎么做到简洁又够用?
*   **Type System**:什么是面向对象的 SOLID 原则?为何 Go 更符合 SOLID?为何接口组合比继承多态更具有正交性?Go 类型系统如何做到 looser、organic、decoupled、independent and therefore scalable?
*   **Orthogonal**:一般软件中如果出现数学,要么真的牛逼,要么就是装逼。正交性这个数学概念在 Go 中频繁出现,是神仙还是妖怪?为何接口设计要考虑正交性?
*   **Modules**:如何避免依赖地狱(Dependency Hell)?小小的版本号为何会带来大灾难?Go 为什么推出了 GOPATH、Vendor 还要搞 module 和 vgo?新建了 16 个仓库做测试,碰到了 9 个坑,搞清楚了 gopath 和 vendor 如何迁移?以及 vgo with vendor 如何使用(毕竟生产环境不能每次都去外网下载)?
*   **Concurrency**:服务器中的并发处理难在哪里?为什么说 Go 并发处理优势占领了云计算开发语言市场?什么是 C10K、C10M 问题?
*   **Context**:如何管理 goroutine 的取消、超时和关联取消?为何 Go1.7 专门将 context 放到了标准库?context 如何使用以及问题在哪里?
*   **Engineering**:Go 在工程化上的优势是什么?为什么说 Go 是一门面向工程的语言?覆盖率要到多少比较合适?什么叫代码可测性?为什么良好的库必须先写 Example?
*   **Go2 Transition**:Go2 会像 Python3 不兼容 Python2 那样作吗?C 和 C++ 的语言演进可以有什么不同的收获?Go2 怎么思考语言升级的问题?
*   **Documents**:Go 官网的重要文档分类,本屌丝读了四遍了,推荐阅读。
*   **SRS**:Go 在流媒体服务器中的使用。

About the Name
--------------

The Go Programming Language 到底是该叫 GO 还是 GOLANG?Google 搜 `Why Go is called Golang` 能搜到几篇经典帖子。

Rob Pike 在 Twitter 上特意说明是 Go,可以看这个 [The language is called Go](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Ftwitter.com%2Frob_pike%2Fstatus%2F886054143235719169):

> Neither. The language is called Go, not Golang. [http://golang.org](https://yq.aliyun.com/go/articleRenderRedirect?url=http%3A%2F%2Fgolang.org)  is just the the web site address, not the name of the language.

在另外一个地方也说明了是 Go,可以看这个 [The name of our language is go](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fwww.reddit.com%2Fr%2Fgolang%2Fcomments%2F30wsrs%2Fthe_name_of_our_language_is_go%2F):

```
The name of our language is Go
Ruby is called Ruby, not Rubylang.
Python is called Python, not Pythonlang.
C is called C, not Clang. No. Wait. That was a bad example.
Go is called Go, not Golang.

Yes, yes, I know all about the searching and meta tags. Sure, whatever,
but that doesn't change the fact that the name of the language is Go.

Thank you for your consideration.
```

![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")

这里举了各种例子说明为何不加 lang 的后缀,当然有个典型的语言是加的,就是 `Erlang`。于是就有回复说“Erlang Erlang, Let's just call it Er.”

那么为什么大多时候 Go 和 Golang 都很常用呢?在 [Why is the Go programming language usually called Golang](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fwww.quora.com%2FWhy-is-the-Go-programming-language-usually-called-Golang) 中说的比较清楚:

```
It’s because “go domain” has been registered by Walt Disney and so Go creators couldn’t use it.
So, they have decided to use golang for the domain name. Then the rest came.

Also, it’s harder to search things on search engines just using the word Go. Although, Rob Pike is
against this idea but I disagree. Most of the time, for the correct results you need to search for
golang.

It’s just Go, not golang but it sticked to it.
```

![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "点击并拖拽以移动")

讲个笑话先,用百度搜下[为何 Go 叫做 Golang](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dutf-8%26amp%3Bf%3D8%26amp%3Brsv_bp%3D0%26amp%3Brsv_idx%3D1%26amp%3Btn%3Dbaidu%26amp%3Bwd%3D%25E4%25B8%25BA%25E4%25BD%2595Go%25E5%258F%25ABGolang%26amp%3Brsv_pq%3Ddf8c96a000057183%26amp%3Brsv_t%3Ddbfadf7wqF%252BceYn6QSuGf5pAW4hIEsSjXqZNyZDYOhK3BP7MncCb50fkh0c%26amp%3Brqlang%3Dcn%26amp%3Brsv_enter%3D1%26amp%3Brsv_sug3%3D16%26amp%3Brsv_sug1%3D14%26amp%3Brsv_sug7%3D100%26amp%3Brsv_sug2%3D0%26amp%3BinputT%3D4004%26amp%3Brsv_sug4%3D4004%26amp%3Brsv_sug%3D1),一大片都是类似本文的鸡汤煲,告诉你为何 Go 才是天地间最合适你的语言,当然本文要成为鸡汤煲中的战斗煲,告诉你全家都应该选择 Go 语言。

为何 Go 语言名字是 Go,但是经常说成是 Golang 呢?有以下理由:

1.  [go.org](https://wanwang.aliyun.com/nametrade/detail/online.html?productType=5&domainName=go.org) 被注册了,正在卖,也不贵才 1698 万。所以 Go 只能用 golang.org;
2.  想要搜点啥信息时,如果搜 go 太宽泛了,特别是 go 还没有这么多用户时,搜 golang 能更精确的找到答案。

为什么在名字上要这么纠结呢?嗯嗯,不纠结,让我们开始干鸡汤吧。

Why Go?
-------

考虑一个商用的快速发展的业务后端服务器,最重要的是什么?当然是稳定性了,如果崩溃可能会造成用户服务中断,崩溃的问题在 C/C++ 服务器中几乎是必然的:

*   稳定是一种假象;

想象一个 C 服务器,一般不会重头码所有的代码,会从一个开源版本开始,或者从一些网络和线程库开始,然后不断改进和完善。由于业务前期并不复杂,上线也没有发现问题,这时候可以说 C 服务器是稳定的吗?当然不是,只是 Bug 没有触发而已,所有崩溃的 Bug 几乎都不是本次发布导致的。野指针和越界是 C 服务器中最难搞定的狼人,这些狼人还喜欢玩潜伏。

*   稳定是短暂的,不稳定是必然和长期的;

一般业务会突飞猛进,特别是越偏上层的业务,需要后端处理的逻辑就越多,至于 UTest 和测试一般只存在于传说中,随着业务的发展,潜伏的狼人越来越多,甚至开源的库和服务器中的狼人也开始出来作妖。夜路走多了,总会碰到鬼,碰到鬼了怎么办?当然是遇鬼杀鬼了,还能被它吓尿不成,所以就反思解决 Bug,费了老劲、又白了几根头发,终于迎来短暂安宁,然后继续写 Bug。

*   最普遍的问题还是内存问题导致崩溃,一般就是野指针和越界;

空指针问题相对很容易查,除零之类的典型错误也容易处理。最完善的解决办法,就是实现 GC,让指针总是有效,无效后再释放,越界时能检测到,这样容易解决问题;其实 Go 早期的版本就和这个很类似了,要实现带 GC 的 C 的同学,可以参考下 Go 的实现。

*   线上的 CPU 和内存的问题,一般不方便使用工具查看,而线上的问题有时候很难在本地重现。

如何能直接获取线上的 Profile 数据,需要程序本身支持。比如提供 HTTP API 能获取到 Profile 数据,关键是如何采集这些数据。

Go 的使命愿景和价值观:

> Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
>
> [Go](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fblog.golang.org%2Fthe-path-to-go-1) is a concurrent open source programming language developed at Google. Combines native compilation and static types with a lightweight dynamic feel. Fast, fun, and productive.>
>
> Go is an attempt to make programmers more productive. The first goal is to make a better language to meet the challenges of scalable concurrency. The larger goal is to make a better environment to meet the challenges of scalable software development, software worked on and used by many people, with limited coordination between them, and maintained for years.

Go 语言的关键字:

*   运行性能高: Statically typed. Native code generation (compiled). Efficiency. Fast development cycle.
*   码农不苦逼: Memory safe. Garbage collected. Safety.
*   云计算专享: Native concurrency support. Concurrency. Scalability.
*   工程师思维: Composition via interfaces. Excellent standard library. Great tools.

> 参考 [The Path to Go1: What is Go?](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Ftalks.golang.org%2F2012%2Fgo1.slide%233) 和 [Another Go at Language Design](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fweb.stanford.edu%2Fclass%2Fee380%2FAbstracts%2F100428-pike-stanford.pdf)。

参考 > [Go: a simple programming environment](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Ftalks.golang.org%2F2012%2Fsimple.slide%234)。

Go 是面向软件工程的语言,Go 在工程上的思考可以读 [Go at Google: Language Design in the Service of Software Engineering](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Ftalks.golang.org%2F2012%2Fsplash.article) 和 [Less is exponentially more](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fcommandcenter.blogspot.com%2F2012%2F06%2Fless-is-exponentially-more.html)。Go 最初是解决 Google 遇到的大规模系统和计算的问题,这些问题如今被称为云计算,参考 [Go, Open Source, Community](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fblog.golang.org%2Fopen-source%23TOC_2.)。

[GITHUT](https://yq.aliyun.com/go/articleRenderRedirect?url=https%3A%2F%2Fmadnight.github.io%2Fgithut)上显示 Go 的项目和 PR 一直在上升,如下图所示。

![3.png](https://ucc.alicdn.com/pic/developer-ecology/8a2cf89080a040f799158ae990103395.png)

 

[原文链接](https://link.zhihu.com/?target=https%3A//yq.aliyun.com/articles/739645%3Futm_content%3Dg_1000094672)

本文为阿里云内容,未经允许不得转载。
分享到:
评论

相关推荐

    毕业设计&课设_CUMT 信息安全专业毕业设计:基于区块链的能源交易系统,含架构、部署等多方面详细介绍.zip

    毕业设计&课设_CUMT 信息安全专业毕业设计:基于区块链的能源交易系统,含架构、部署等多方面详细介绍.zip

    用Python分析文本数据项目

    用Python分析文本数据项目

    基于SpringBoot的养老院管理系统源码数据库文档.zip

    基于SpringBoot的养老院管理系统源码数据库文档.zip

    AshampooUnInstaller v15.00.22 Portable一款强大的卸载工具,彻底、智能著称阿香婆强制卸载软件.rar

    阿香婆软件强制卸载软件 Ashampoo UnInstaller 是一款强大的卸载工具,彻底、智能著称,如果您选择使用Ashampoo安装程序,它会自动分析软件从开始安装到结束的全过程,并为该软件建立一个日志,以便以后更彻底的卸载它,Ashampoo UnInstaller 全面提速!程序采用了新的技术,速度得到了全面提高。Windows 默认应用现在也可以像其它无用程序和恶意软件一样被无忧卸载。摆脱工具栏、插件和其它隐藏的追踪软件,享受安全快捷的上网体验!新的快照比较功能,可以非常简单的创建安装日志,这是旧版本 UnInstaller 粉丝最急需的!新的界面,便捷的批量卸载,以及内置的在线搜索,Ashampoo UnInstaller 一定会让你惊叹无比。快来体验更清晰、更详尽、更快速的 Ashampoo UnInstaller !Ashampoo UnInstallerAshampoo UnInstaller彻底删除无用程序的所有痕迹! 让安装、试用、卸载程序更加轻松。只需点几下,无用的软件、浏览器扩展和工具栏就能从你的硬盘中

    基于java的公交车信息管理系统开题报告.docx

    基于java的公交车信息管理系统开题报告

    基于java的网络书店系统的开题报告.docx

    基于java的网络书店系统的开题报告

    forge-1.20.1-47.3.0-installer.jar

    forge-1.20.1-47.3.0-installer

    实例-文本进度条源代码

    python

    基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip

    基于springboot云平台的信息安全攻防实训平台源码数据库文档.zip

    基于SpringBoot的房屋租赁系统源码数据库文档.zip

    基于SpringBoot的房屋租赁系统源码数据库文档.zip

    毕业设计&课设_家居物联网毕业设计项目:利用多种设备实现,含架构、目标.zip

    毕业设计&课设_家居物联网毕业设计项目:利用多种设备实现,含架构、目标.zip

    基于springboot的非学勿扰学习交流平台源码数据库文档.zip

    基于springboot的非学勿扰学习交流平台源码数据库文档.zip

    网络安全教程:基础知识到高级概念全面解读

    内容概要:本文详细介绍了网络安全领域的基础知识和高级概念,涵盖了网络安全概述、网络架构与协议、操作系统安全、网络攻击与防御、密码学与安全协议、身份认证与访问控制、系统漏洞与补丁管理、网络安全实践及发展趋势与挑战等内容。 适合人群:信息安全专业人员、IT运维人员、网络安全工程师、系统管理员。 使用场景及目标:本文不仅帮助读者理解网络安全的理论知识,还能指导实际操作,适用于日常网络安全管理和应急响应。目标在于增强个人和企业对网络安全的认识,提升防护能力。 其他说明:网络安全是一个不断发展变化的领域,文中提到的内容和技术应及时跟进最新的发展动态,确保网络安全的有效性。

    java毕设项目之基于SpringBoot的特殊儿童家长教育能力提升平台(源码+说明文档+mysql).zip

    环境说明:开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器。 项目经过测试均可完美运行

    精选微信小程序源码:仿京东白条小程序(含源码+源码导入视频教程&文档教程,亲测可用)

    微信小程序是一种轻量级的应用开发平台,主要针对移动端,由腾讯公司推出,旨在提供便捷的、无需下载安装即可使用的应用服务。"京东白条"是京东金融推出的一种信用消费产品,用户可以在京东商城购物时享受先消费后付款的便利。这款"微信小程序京东白条小程序源码"包含了实现这一功能的小程序源代码,以及相应的导入教程,对于开发者来说,是一个有价值的参考资料。 源码是程序开发的基础,它包含了开发者编写的控制程序行为的指令。在这个案例中,源码可能包括了与京东白条接口交互的逻辑,用户界面设计,以及数据处理等功能。通过分析这些源码,开发者可以学习如何集成京东的API,实现白条的查询、支付和管理等操作。 "源码导入视频教程"和"源码导入文档教程"是辅助开发者理解和使用源码的重要资料。视频教程通常以直观的方式展示源码的导入步骤和环境配置,帮助开发者快速上手。文档教程则可能包含了详细的步骤说明,解决常见问题的技巧,以及开发过程中的注意事项,对于初学者来说尤其有价值。 微信小程序的开发涉及到以下几个关键技术点: 1. **WXML(Weixin Markup Language)**:这是微信小程序的视图层语言,

    数字孪生赋能智慧城市大脑建设方案PPT(65页).pptx

    市大脑的基础平台是支撑其高效运行的关键。该平台通过整合电子政务网、视联网、互联网等多网资源,以及云计算、大数据、人工智能等先进技术,打造了一个统一、开放、可扩展的底层架构。在这个基础上,城市大脑能够接入海量数据,包括但不限于视频监控、交通流量、环境监测、民生服务等领域的实时数据,并进行高效处理和分析。这些数据经过清洗、转换、开发后,形成了丰富的数据资源池,为城市治理提供了坚实的数据支撑。 在数据资源的基础上,智慧城市大脑进一步构建了算法服务平台和融合业务应用系统。算法服务平台集成了多种先进的视频分析算法和人工智能算法,如人脸识别、车辆识别、城市问题智能识别等,这些算法能够实时分析视频流和数据流,快速识别城市运行中的问题和异常。同时,融合业务应用系统则将这些算法与城市治理的各个领域相结合,如交通、环保、旅游、医疗等,形成了多个具有实战价值的应用场景。例如,在交通领域,城市大脑能够通过实时分析交通流量和路况信息,优化信号灯控制策略,缓解交通拥堵;在环保领域,则能够实时监测空气质量和水质情况,及时预警环境污染事件。 数字驾驶舱是智慧城市大脑的又一亮点。它作为城市治理能力现代化的新抓手,实现了数据一屏展示、指标一屏分析、指挥一屏联动、场景一屏闭环和治理一屏透视。通过数字驾驶舱,决策者可以直观地看到城市运行的全貌,及时获取关键信息,做出准确的判断和决策。同时,数字驾驶舱还能够根据用户的需求进行个性化配置,提供多种数据处理和分析工具,帮助用户深入挖掘数据价值,提升城市治理的精细化和智能化水平。 智慧城市大脑的建设成效显著。它不仅提高了城市治理的效率和准确性,还带来了显著的社会效益和经济效益。通过优化资源配置、降低运营成本、提升服务质量等方式,智慧城市大脑为城市居民提供了更加便捷、高效、舒适的生活环境。同时,它也为城市的可持续发展注入了新的动力,推动了产业升级和经济转型。可以说,智慧城市大脑已经成为了未来城市发展的重要方向和趋势,它将引领我们走向一个更加智慧、绿色、宜居的城市新时代。 总的来说,智慧城市大脑是一个集数据、算法、应用为一体的综合性解决方案,它通过高度集成和智能分析,实现了城市治理的精细化和智能化。在未来的发展中,随着技术的不断进步和应用场景的不断拓展,智慧城市大脑将会发挥出更加巨大的潜力和价值,为城市的可持续发展和社会的全面进步做出更大的贡献。

    毕业设计&课设_景区购票系统(含更新情况、数据字典及多种语言实现).zip

    毕业设计&课设_景区购票系统(含更新情况、数据字典及多种语言实现).zip

    上传一个考研冲刺资源dssdf

    上传一个【考研冲刺】资源

    C0858 手机之家(1页).Zip

    C0858 手机之家(1页).Zip

Global site tag (gtag.js) - Google Analytics