`
大涛学长
  • 浏览: 104084 次
  • 性别: 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)

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

相关推荐

    golang GO语言开发工具

    golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO语言开发工具golang GO...

    Golang开发培训知识图谱

    Golang开发培训知识图谱覆盖了Golang语言的基础知识点和高级应用技能。Golang(通常称为Go)是由Google开发的静态类型、编译型语言,其设计初衷是让编程更简单、高效、安全。该知识图谱主要包含以下几个模块: 1. *...

    Go/Golang DevOps运维开发实战集训营

    在“Go/Golang DevOps运维开发实战集训营”中,我们主要探讨的是如何利用Go语言,也称为Golang,进行DevOps实践以及与Kubernetes(k8s)的集成应用。这个集训营课程专注于2022年5月29日的最新技术趋势,旨在帮助...

    GO 语言学习辅导共220页.pdf

    《GO 语言学习辅导》是一本全面介绍Go语言的教程...通过深入学习《GO 语言学习辅导》,无论是对Go语言的初学者还是有一定经验的开发者,都能从中获得宝贵的知识和实践经验,进一步提升自己在Go语言开发领域的专业技能。

    Go语言实战_golang教程_Go_go_

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、C风格的编程语言。它旨在提高编程效率,简化系统编程,并且能够支持大规模的网络服务和分布式计算。Go语言实战教程是学习Go...

    学习 Go 语言(Golang)

    总之,“学习 Go 语言(Golang).pdf”这份文档应该是一个全面的指南,涵盖了从入门到进阶的所有关键知识点,帮助你快速掌握 Go 语言并能应用于实际开发中。通过系统学习,你将能够理解 Go 语言的核心理念,并具备使用...

    最好用的Go图片相似查找,Golang语言

    在IT行业中,Go语言(Golang)以其高效、简洁和强大的并发能力被广泛应用于各种领域,包括图像处理。本文将深入探讨如何利用Go语言进行图片相似性查找,并结合描述中的"gabs-1.0"文件,来解析这一过程。 首先,让...

    【超全golang面试题合集+golang学习指南+golang知识图谱+入门成长路线】 一份涵盖大部分golang.zip

    "【超全golang面试题合集】"很显然是一份包含各种Go语言面试问题的集合,适合准备面试或者自我评估的开发者使用。"【golang学习指南】"可能是一份详细的教程或教材,为初学者提供了系统学习Go语言的路径和指导。"...

    大厂Go开发工程师面试通关指南.rar

    《大厂Go开发工程师面试通关指南》是一份针对Go语言开发者在互联网大厂求职过程中的必备参考资料。这份压缩包包含了两部分核心内容:《大厂Go开发面试题集锦.docx》和《Golang_常见面试题目解析.pdf》,旨在帮助求职...

    Go-基于golang语言开发一个个人博客项目

    在本项目中,我们将深入探讨如何使用Golang(Go语言)来开发一个个人博客系统。Golang作为一种现代、高效且简洁的编程语言,因其强大的并发处理能力、内存管理以及易于学习的特点,近年来在Web开发领域得到了广泛...

    【超全golang面试题合集+golang学习指南+golang知识图谱+入门成长路线】

    【超全golang面试题合集+golang学习指南+golang知识图谱+入门成长路线】 一份涵盖大部分golang程序员所需要掌握的核心知识。常用第三方库(mysql,mq,es,redis等)+机器学习库+算法库+游戏库+开源框架+自然语言处理nlp...

    go语言中文教程及手册.pdf

    Go语言,也称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。Go语言的设计目标是提高程序员的工作效率,它具有高表达力、简洁、清晰和高效的特性。Go语言的一个显著特点...

    golang 中文离线文档 go文档中文

    Go语言,又称Golang,是Google在2009...总之,这个`pkgdoc.exe`程序是你离线学习和研究Go语言的强大工具,它使你能够在没有互联网连接的情况下,随时查阅和理解Go语言的各种概念和技术,是每个Go开发者值得拥有的资源。

    基于go语言开发的订餐系统(含数据库文件).zip

    《基于Go语言开发的订餐系统详解》 在信息技术领域,Go语言因其简洁的语法、高效的性能以及强大的并发处理能力,越来越受到开发者的青睐。本篇文章将深入探讨一个基于Go语言开发的订餐系统,包括其核心设计理念、...

    用JetBrains PyCharm IDE搭建Go语言开发环境.doc

    在本文中,我们将详细介绍如何使用JetBrains的PyCharm IDE搭建Go语言的开发环境。Go语言,也称为Golang,是一种高效、可靠的编程语言,特别适合于多处理器系统的应用程序开发。Go编译出的程序在速度上可与C或C++相...

    GO语言开发2048内含源码以及说明书可以自己运行复现.zip

    在本资源中,我们主要探讨的是使用Go语言开发2048游戏的全过程。2048是一款基于数字合并的益智游戏,玩家通过上下左右滑动棋盘,使得相同数字的方块合并,最终目标是达到数字2048。这个项目不仅适合初学者学习Go语言...

    Go-resize-纯golang实现的图像大小调整库

    Go-resize是一个用纯Go语言编写的图像大小调整库,专为Go开发者设计,用于高效地处理和调整图像尺寸。这个库提供了灵活且性能优化的方法,使得在Go应用程序中进行图像缩放、裁剪等操作变得简单易行。在本文中,我们...

    Go语言15套教程(百度网盘)

    ### Go语言15套教程知识点概述 #### 01 Go语言基础(一) - **Go语言简介**:介绍Go语言的发展历史、设计理念及其优势特点。 - **环境搭建**:指导如何在Windows/Linux/MacOS环境下安装Go语言环境,并配置环境变量...

Global site tag (gtag.js) - Google Analytics