Go应用场景与适应项目
Go应用领域
鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还适用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。
Go应用领域
服务器编程
以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。微服务
现在越来越多新的项目采用微服务架构,前面介绍的优秀项目中也看到很多Go提供的微服务框架,如git-kit、go-micro等。
举些具体公司的例子。
比如今日头条,2017的一篇文章今日头条使用Go构建了千万级微服务,其中说到有80%的流量都跑在Go上,其中提到头条还开发了自己的一套微服务框架;还有B站也是采用的Go开发。云平台
云服务很多都是采用Go进行开发,比如国内著名的七牛云是全站采用Go开发;还有如盛大CDN、阿里云CDN,华为云等。而且云平台基础设施如docker、kubernetes等也是Go开发;Web
网络编程这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
曾经的web 领域主要是Java、C#和PHP这三大语言。而现在基本每种语言都有自己完善的web生态,Go也是如此,标准库已经自带成熟简单的net/http包。而且Go的主流Web开发框架也有很多,比如 gin、beego、iris 等等。区块链
当前两个主流的区块链框架,分布式记账本框架hyperledger和以太坊合约框架 go-ethereum都是使用Go开发; 再比如fabric是目前最知名的联盟链, 也有go语言的版本
某招聘网站的区块链职位要求技能的分析,如下图。分布式
诸如数据库中间件、分布式系统/分布式存储、代理服等项目很多是采用Go开发,比如前面的介绍cockroachdb、etcd等;
京东云消息推送系统、云存储等都有使用Go做开发、360的推送服务也在使用。
Go官方有篇博客blog.golang.org/qihoo 就是出自他们。其他
除了上面介绍的这些,其实很多领域都能看到Go的影子,如直播领域、游戏开发、Al算法等等,在其中Go为后台的调度系统、任务处理,批量的数据计算、系统监控等都提供了各种优秀的解决方案。
比如知乎也使用Go进行重构了自己的推荐系统,查看文章舍弃Python,为什么知乎选用Go重构推荐系统?
Go不适合领域
- GUI: 例如开发IDE、移动App
- 数据分析、ML、大数据:需要极完整的集合框架、流畅的推导式、丰富的高阶函数
- 分布式计算:需要分布化地远程执行闭包,自动地序列化/反序列化;而不是新起进程执行二进制分发、进程间交换数据。移动闭包/Lambda的成本会小于移动大块数据
- 插件化定制、进程内热升级:需要语言虚拟机的支持,例如动态类加载,依赖注入
- 企业软件: 需要COTS交付、二次开发,基于非源代码的接口扩展,可以在重启或运行时启用新特性,无需编译整个系统的源代码。这类软件常常用像annotation一样的APT机制对语言元素做一定程度的元编程或修改
- 超大型软件和团队:需要很明确地on the fly地知道哪个接口被哪些类型实现了,哪些类型实现了哪些接口。Eclipse有1000W行LOC,InteliJlDEA有700W,JDK自身也有700W,Hadoop+HBase有400w,JBoss等应用服务器有600W,Spring框架有200W,其它第三方库...日常开发的JAVA商用软件,你常常跟几千万LOC打交道。但好像GO超过50W的开源项目只有限的Docker、K8S等。GO的开源生态系统仍然极其弱小,能用于商用产品质量的开源库只有Beego等屈指可数的几个。许多依赖开源库只有2位数的star。
- 另外Go快10年了,还没有进入大学,企业一般要自己培训培养合格工程师,雇佣数百人的培训成本(包括重复踩坑)还是蛮高的。历史上语言10年后,它的排名基本上会稳定下来,很难有大幅度上升了。例如,当年的Ruby也是大约10年后随着ROR火了一阵子。因为语言之间是互相学习演进的,GO曾经的卖点协程,已经陆续出现在其它语言中了,而GO预计下个10年仍可能会这个样子。
Go优秀项目
语言的目标是用于项目开发,并能打造出很多优秀的产品。那么,Golang有哪些好像优秀的项目呢?不搜不知道,一搜吓一跳!列举一下我收集到的golang开发的优秀项目,如下:
- docker: golang头号优秀项目,通过虚拟化技术实现的操作系统与应用的隔离,也称为容器;
- kubernetes: 由google开发,简称k8s,k8s和docker是当前容器化技术的重要基础设施;
- etcd: 一种可靠的分布式KV存储系统,有点类似于zookeeper,可用于快速的云配置;
- codis: 由国人开发提供的一套优秀的redis分布式解决方案;
- tidb: 国内PingCAP 团队开发的一个分布式SQL 数据库,国内很多互联网公司在使用;
- influxdb: 时序型DB,着力于高性能查询与存储时序型数据,常用于系统监控与金融领域;
- cockroachdb: 云原生分布式数据库,继NoSQL之后出现的新的概念,称为NewSQL数据库;
- beego: 国人开发的一款及其轻量级、高可伸缩性和高性能的web应用框架;
- caddy: 类比于nginx,一款开源的,支持HTTP/2的 Web 服务端;
- flynn: 一款开源的paas平台;
- consul: HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置;
- go-kit: Golang相关的微服务框架,这类框架还有go-micro、typthon;
- go-ethereum: 官方开发的以太坊协议实现;
- couchbase: 是一个非关系型数据库;
- nsq: 一款高性能、高可用消息队列系统,每天能处理数十亿条的消息;
- packer: 一款用来生成不同平台的镜像文件的工具,例如VM、vbox、AWS等;
- doozer: 高速的分布式数据同步服务,类似ZooKeeper;
- tsuru: 开源的PAAS平台,和SAE实现的功能一模一样;
- gor: 一款用Go语言实现的简单的http流量复制工具;
国内大厂开源的Golang项目
- 字节跳动:kitex,开源
- 滴滴:有自己的一套微服务框架,未开源
- 腾讯:TarsGo,开源,并且是Linux基金会项目
- B站:kratos,开源
- 斗鱼:Jupiter,开源
- 好未来:go-zero,开源
- 阿里:dubbo-go,开源
- 华为:Go Chassis,开源
- 知乎:内部改用go重构后端
golang相关网址
Go语言官方网址
官网里面新手推荐看:A Tour of Go(Go语言编程指南)(中文版本在这里: Go 指南):主要是带你了解基础的Go语言和使用方法,重点是有个在线编译器,可以在浏览器里面写Go语言,直观感受Go语言;
How to Write Go Code:也是带你入门学习Go语言的,类似教程吧,英文的,新手同样可以看;
https://golang.org/ref/spec:Go编程语言的参考手册,英文的;