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

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

Go 开发指南大图

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:

Neither. The language is called Go, not Golang. http://golang.org  is just the the web site address, not the name of the language.

在另外一个地方也说明了是 Go,可以看这个 The name of our language is go:

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.

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

那么为什么大多时候 Go 和 Golang 都很常用呢?在 Why 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.

讲个笑话先,用百度搜下为何 Go 叫做 Golang,一大片都是类似本文的鸡汤煲,告诉你为何 Go 才是天地间最合适你的语言,当然本文要成为鸡汤煲中的战斗煲,告诉你全家都应该选择 Go 语言。

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

  1. 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 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? 和 Another Go at Language Design。

参考 > Go: a simple programming environment。

Go 是面向软件工程的语言,Go 在工程上的思考可以读 Go at Google: Language Design in the Service of Software Engineering 和 Less is exponentially more。Go 最初是解决 Google 遇到的大规模系统和计算的问题,这些问题如今被称为云计算,参考 Go, Open Source, Community。

GITHUT上显示 Go 的项目和 PR 一直在上升,如下图所示。

2014 云计算行业中使用 Go 的有:Docker, Kubernetes, Packer, Serf, InfluxDB, Cloud Foundry’s gorouter and CLI, CoreOS’s etcd and fleet, Vitess | YouTube’s tooling for MySQL scaling, Canonical’s Juju (rewritten in Go), Mozilla’s Heka, A Go interface to OpenStack Swift, Heroku’s Force.com and hk CLIs, Apcera’s NATS and gnatsd。

2018 年全球使用 Go 的公司数目有:US(329), Japan(79), Brazil(52), India(49), Indonesia(45), China(32), UK(32), Germany(28), Israel(24), France(17), Netherlands(16), Canada (15), Thailand(14), Turkey(14), Spain(12), Poland(11), Australia(9), Russia(9), Iran(8), Sweden(7), Korea(South)(6), Switzerland(6), Ukraine(5)。

参考 Go as the emerging language of cloud infrastructure、The RedMonk Programming Language Rankings: June 2018,还有 GoUsers 以及 Success Stories。

参考 > "Go: 90% Perfect, 100% of the time" -bradfitz, 2014。参考 > Nine years of Go: Go Contributors,社区贡献的代码比例。

我们一起看看这些 Go 牛逼的特性,详细分析每个点,虽然不能涵盖所有的点,对于常用的 Go 的特性我们做一次探讨和分析。

Milestones

接下来看一下有关 Go 的重要事件:

  • 2019 年 9 月,Go1.13 发布。增强了 modules,新增了环境变量 GOPRIVATE 和 GOSUMDB,GOPROXY 支持多个,支持了 ErrorWraping;
  • 2019 年 2 月,Go1.12 发布,支持了 TLS1.3,改进了 modules,优化运行时和标准库;
  • 2018 年 8 月,Go1.11 发布,实验性支持 modules,实验性支持 WebAssembly;
  • 2018 年 2 月,Go1.10 发布,go tool 缓存编译,编译加速,很多细微的改进;
  • 2018 年 1 月,Hello, 中国! 及 中国站镜像上线,大陆可以访问官网资源;
  • 2017 年 8 月,Go1.9 发布,支持 Type Alias、sync.Map,使用场景参考 slides,time 保持单增避免时间测量问题;
  • 2017 年 2 月,Go1.8 发布,显著的性能提升,GC 延迟降低到了 10us 到 100us,支持 HTTP/2 Push,HTTP Server 支持 Shutdown,sort.Slice 使排序使用更简单;
  • 2016 年 8 月,Go1.7 发布,支持了 Context,Context 在 K8s 和 Docker 中都有应用,新的编译算法减少 20%-30% 的二进制尺寸;
  • 2016 年 2 月,Go1.6 发布,支持 HTTP/2,HTTPS 时会默认开启 HTTP/2,正式支持 vendor;
  • 2015 年 8 月,Go1.5 发布,完全用 Go 代替了 C 代码,完全重新设计和重新实现 GC,支持 internal 的 package,实验性支持 vendor,GOMAXPROCS 默认为 CPU 个数;
  • 2014 年 12 月,Go1.4 发布,支持 Android,从 Mecurial 迁移到了 Git,从 GoogleCode 迁移到了 Github: golang/go,大部分 runtime 的代码从 C 改成了 Go,for 支持三种迭代写法;
  • 2014 年 6 月,Go1.3 发布,支持了 FreeBSD、Plan9、Solaris 等系统;
  • 2013 年 12 月,Go1.2 发布,新增收集覆盖率工具 coverage,限制了最高线程数 ThreadLimit;
  • 2013 年 5 月,Go1.1 发布,主要是包含性能优化,新增 Data Race Detector 等;
  • 2012 年 3 月,Go1.0 发布,包含了基本的语言元素比如 rune、error、map,标准库包括 bufio、crypto、flag、http、net、os、regexp、runtime、unsafe、url、encoding 等;
  • 2009 年 11 月, Google 宣布要开发一门新语言,既要开源,又有 Python 的好处,还要有 C/C++ 的性能。GO 是 BSD 的 License,大部分 GO 的项目都是 BSD 或 MIT 或 Apache 等商业友好的协议。


原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序开发(10)-之热力图解决方案、手绘图

原本是用别人用canvas画的热力图的https://github.com/rover95/wxapp-heatmap,但是问题有点多,热力图的颜色,卡顿、叠加、渲染失败等,所以就弃用了,也找了好久,好像大家都没有更好的提议,自己也…

windows下mysql8.x配置远程连接

文章目录1. 现象2. 登录mysql3.先查看下当前的用户,具有什么权限4.创建新的用户之后再查权限5. 赋予权限6.刷新权限,然后就可远程访问了1. 现象 Host ‘192.168.0.103’ is not allowed to connect to this MySQL server mysql8.x配置远程连接 2. 登…

Spark整合Ray思路漫谈

什么是Ray 之前花了大概两到三天把Ray相关的论文,官网文档看了一遍,同时特意去找了一些中文资料看Ray当前在国内的发展情况(以及目前国内大部分人对Ray的认知程度)。 先来简单介绍下我对Ray的认知。 首先基因很重要&#xff0c…

建设数据中台之前,建议先看这份企业数据能力测评 | 大咖说中台

作者 | 耿立超来源 | 《大数据平台架构与原型实现:数据中台建设实战》“我的企业目前在数据应用上处于什么水平?接下来应该朝哪个方向努力?”本文试图帮助企业决策者和IT负责人解答这一问题。今天,数据之于企业的重要性已经勿须多…

如何让 python 处理速度翻倍?内含代码

阿里妹导读:作为在日常开发生产中非常实用的语言,有必要掌握一些python用法,比如爬虫、网络请求等场景,很是实用。但python是单线程的,如何提高python的处理速度,是一个很重要的问题,这个问题的…

Zipkin 存储追踪数据至 MySQL

下载zipkin-mysql数据库脚本 https://github.com/openzipkin/zipkin/tree/master/zipkin-storage/mysql-v1/src/main/resources 创建数据库名称为zipkin,字符集编码:utf8mb4 初始化脚本 -- -- Copyright 2015-2019 The OpenZipkin Authors -- -- Licen…

Spring Cloud Alibaba 新一代微服务解决方案

本篇是「跟我学 Spring Cloud Alibaba」系列的第一篇, 每期文章会在公众号「架构进化论」进行首发更新,欢迎关注。 1、Spring Cloud Alibaba 是什么 Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件…

它估值25亿!被马云领投,是华为“老战友”,网友:也许股价能超茅台!

最近一条新闻被炒的沸沸扬扬:十年以来中国最大IPO,中芯国际将融资532亿元!何为IPO?翻译即为一家公司第一次向全社会公开售出它的股份。买的人越多,代表着社会对其信心越大。为什么2020年,能爆发这样1场最大…

RabbitMQ 最新版安装 (Linux环境)

文章目录一、Erlang1. Erlang下载2. Erlang 上传并解压3. 验证rabbitmq依赖是否安装4. 安装rabbitmq依赖5. Erlang 编译、安装6. Erlang 配置环境变量7. Erlang 验证二、RabbitMQ2.1. RabbitMQ 下载2.2. RabbitMQ 上传并解压2.3. RabbitMQ 配置2.4. 配置环境变2.5. 启动 Rabbit…

双11 背后的全链路可观测性:阿里巴巴鹰眼在“云原生时代”的全面升级

导读:作为一支深耕多年链路追踪技术 (Tracing) 与性能管理服务 (APM) 的团队,阿里巴巴中间件鹰眼团队的工程师们见证了阿里巴巴基础架构的多次升级,每一次的架构升级都会对系统可观测性能力 (Observability) 带来巨大挑战,而这次的…

一切转型始于数据和模型 | 2020 MATLAB EXPO 中国线上用户大会:即将上线

2020 MATLAB EXPO 中国线上用户大会一切转型始于数据和模型2020 年 7 月 21-24 日 | 线上直播MATLAB 和 Simulink,作为业界普遍使用的科学计算与模型仿真软件,已被全球的工程师和科学家们广泛应用于加快汽车、航空、电子、金融服务、生物医药以及其他行业…

Dubbo 如何成为连接异构微服务体系的最佳服务开发框架

从编程开发的角度来说,Apache Dubbo (以下简称 Dubbo )首先是一款 RPC 服务框架,它最大的优势在于提供了面向接口代理的服务编程模型,对开发者屏蔽了底层的远程通信细节。同时 Dubbo 也是一款服务治理框架,…

Zipkin 基于MQ存 储链路信息至 MySQL

RabbitMQ 最新版安装 (Linux环境) https://gblfy.blog.csdn.net/article/details/120498390 启动rabbitmq 队列是空的 数据库表是无数据的 启动nacos 应用集成rabbitMQ 父工程导入依赖 <!-- 消息队列通用依赖 --><dependency><groupId>org.springframewo…

标签编辑新工具:如何使用控制台标签编辑器(Tag editor)

创建阿里云资源时&#xff0c;您可以给资源绑定标签。已经创建的资源&#xff0c;也可以在资源列表页面或者通过API&#xff0c;批量的添加、更改和删除标签。当遇到如下更为复杂问题和场景&#xff0c;该如何快速解决标签问题呢&#xff1f; 资源跨度大&#xff0c;需要跨资源…

炸裂!这些大厂跪求的人才太牛了!

今年所有的互联网公司都在ALL in AI&#xff0c;百度、腾讯、阿里巴巴、京东等互联网巨头都在四处挖掘AI人才。AI的岗位需求很多&#xff0c;几乎每天都有数百个JD放出。而亿欧智库发布的《2020全球人工智能人才培养研究报告》提到&#xff0c;至今为止AI的人才储备仍跟不上需求…

60TB 数据量的作业从 Hive 迁移到 Spark 在 Facebook 的实践

Facebook 经常使用分析来进行数据驱动的决策。在过去的几年里&#xff0c;用户和产品都得到了增长&#xff0c;使得我们分析引擎中单个查询的数据量达到了数十TB。我们的一些批处理分析都是基于 Hive 平台&#xff08;Apache Hive 是 Facebook 在2009年贡献给社区的&#xff09…

阿里主管通知我试用期延期……

阿里妹导读&#xff1a;接下来的文章是一篇发布在阿里内网里的文章。花木是一位走出体制的博士&#xff0c;讲述自己Landing的经历。今天&#xff0c;她将这段经历分享给大家&#xff0c;告诉我们&#xff1a;脸先着地又怎样&#xff0c;哪有那么多坦途&#xff1b;最美的&…

使用hbuilder的maps模块调起百度地图导航

首先需要在百度地图开放平台&#xff0c;创建应用拿到appid&#xff0c;然后在hbuilder进行如下配置&#xff1a; hbuilder的manifest.json的配置如下&#xff1a; permissions下添加如下代码&#xff1a; "Maps": {"description": "地图"} 然…

SpringBoot2.x RabbitMQ Nacos Nacos-Config

文章目录一、依赖配置1. 引入依赖2. 配置文件3. 主配置二、生产者代码代码Conding2.1. 发送客户端2.2. 确认机制2.3. 消息 return机制2.4. controller2.5. MQ工具类2.6. 常量类三、消费端3.2. 消费者代码3.2. RabbitMQ常用命令一、依赖配置 1. 引入依赖 <!--服务注册发现--…

考拉海购技术支持的前世今生

本文来自考拉海购技术支持中心负责人--书渊的分享&#xff0c;想和大家聊一聊考拉技术支持的前世今生&#xff0c;在这个发展历程的介绍当中&#xff0c;大家也可以此对考拉窥一斑而知全豹。当然&#xff0c;既然是聊我们的家常(“黑历史”)&#xff0c;我会从这几年在考拉供应…