湖北建设监理协会网站,阅读网页设计,在阿里巴巴上做网站有效果吗,上海电子商城网站导读#xff1a;从问题本身出发#xff0c;不局限于 Go 语言#xff0c;探讨服务器中常常遇到的问题#xff0c;最后回到 Go 如何解决这些问题#xff0c;为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》#xff0c;共有 4 篇文… 导读从问题本身出发不局限于 Go 语言探讨服务器中常常遇到的问题最后回到 Go 如何解决这些问题为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》共有 4 篇文章本文为第 1 篇。 Go 开发指南大图 Overview
该指南主要讨论了服务器领域常见的并发问题也涉及到了工程化相关的问题还整理了 C 背景程序员对于 Go 的 GC 以及性能的疑问探讨了 Go 的错误处理和类型系统最佳实践以及依赖管理的难处、接口设计的正交性当然也包含我们在服务器开发中对于 Go 实践的总结有时候也会对一些有趣的问题做深度的挖掘列出了 Go 重要的事件和资料集合以及 Go2 的进展和思考。
以下是各个章节以及简介
About the Name为何 Go 有时候也叫 Golang?Why Go为何要选择 Go 作为服务器开发的语言是冲动还是骚动MilestonesGo 的重要里程碑和事件当年吹的那些牛逼都实现了哪些GCGo 的 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 scalableOrthogonal一般软件中如果出现数学要么真的牛逼要么就是装逼。正交性这个数学概念在 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 如何使用以及问题在哪里EngineeringGo 在工程化上的优势是什么为什么说 Go 是一门面向工程的语言覆盖率要到多少比较合适什么叫代码可测性为什么良好的库必须先写 ExampleGo2 TransitionGo2 会像 Python3 不兼容 Python2 那样作吗C 和 C 的语言演进可以有什么不同的收获Go2 怎么思考语言升级的问题DocumentsGo 官网的重要文档分类本屌丝读了四遍了推荐阅读。SRSGo 在流媒体服务器中的使用。
About the Name
The Go Programming Language 到底是该叫 GO 还是 GOLANGGoogle 搜 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 doesnt change the fact that the name of the language is Go.Thank you for your consideration.
这里举了各种例子说明为何不加 lang 的后缀当然有个典型的语言是加的就是 Erlang。于是就有回复说“Erlang Erlang, Lets 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 呢有以下理由
go.org 被注册了正在卖也不贵才 1698 万。所以 Go 只能用 golang.org想要搜点啥信息时如果搜 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 和 GOSUMDBGOPROXY 支持多个支持了 ErrorWraping2019 年 2 月Go1.12 发布支持了 TLS1.3改进了 modules优化运行时和标准库2018 年 8 月Go1.11 发布实验性支持 modules实验性支持 WebAssembly2018 年 2 月Go1.10 发布go tool 缓存编译编译加速很多细微的改进2018 年 1 月Hello, 中国! 及 中国站镜像上线大陆可以访问官网资源2017 年 8 月Go1.9 发布支持 Type Alias、sync.Map使用场景参考 slidestime 保持单增避免时间测量问题2017 年 2 月Go1.8 发布显著的性能提升GC 延迟降低到了 10us 到 100us支持 HTTP/2 PushHTTP Server 支持 Shutdownsort.Slice 使排序使用更简单2016 年 8 月Go1.7 发布支持了 ContextContext 在 K8s 和 Docker 中都有应用新的编译算法减少 20%-30% 的二进制尺寸2016 年 2 月Go1.6 发布支持 HTTP/2HTTPS 时会默认开启 HTTP/2正式支持 vendor2015 年 8 月Go1.5 发布完全用 Go 代替了 C 代码完全重新设计和重新实现 GC支持 internal 的 package实验性支持 vendorGOMAXPROCS 默认为 CPU 个数2014 年 12 月Go1.4 发布支持 Android从 Mecurial 迁移到了 Git从 GoogleCode 迁移到了 Github: golang/go大部分 runtime 的代码从 C 改成了 Gofor 支持三种迭代写法2014 年 6 月Go1.3 发布支持了 FreeBSD、Plan9、Solaris 等系统2013 年 12 月Go1.2 发布新增收集覆盖率工具 coverage限制了最高线程数 ThreadLimit2013 年 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 等商业友好的协议。
原文链接 本文为阿里云原创内容未经允许不得转载。