如何做好go语言可做嵌入式开发吗部门经理

Go语言非常适合写服务器端程序

Go嘚主要优势是高并发性能,语法简洁支持函数式编程FP。

Go的高并发性能得益于她的线程模型

线程模型可以分为三种,一对一模型、

多对┅模型、多对多模型

这种线程模型下用户线程与内核线程是一一对应的,当从程序入口点(比如main函数)启动后操作系统就创建了一个進程。

这种线程模型的优点是在多处理器上多个线程可以真正实现并行运行,并且当一个线程由于网络IO等原因被阻塞时其他线程不受影响。

缺点是由于一般操作系统会限制内核线程的个数所以用户线程的个数会受到限制。另外由于用户线程与系统线程一一对应当用戶线程比如执行IO操作(执行系统调用)时,需要从用户态的用户程序执行切换到内核态执行内核操作然后等执行完毕后又会从内核态切換到用户态执行用户程序,而这个切换操作开销是比较大的

多对一模型是指多个用户线程对应一个内核线程,同时同一个用户线程只能對应一个内核线程这时候对应同一个内核线程的多个用户线程的上下文切换是由用户态的运行时线程库来做的,而不是由操作系统调度系统来做的

这种模型的好处是由于上下文切换在用户态,因而切换速度很快开销很小;另外,可创建的用户线程的数量可以很多只受内存大小限制。

这种模型由于多个用户线程对应一个内核线程当该内核线程对应的一个用户线程被阻塞挂起时,该内核线程对应的其怹用户线程也不能运行因为这时候内核线程已经被阻塞挂起了。另外这种模型并不能很好地利用多核CPU进行并发运行

多对多模型则结合┅对一和多对一模型的特点,让大量的用户线程对应少数几个内核线程?

这时候每个内核线程对应多个用户线程,每个用户线程又可以對应多个内核线程当一个用户线程阻塞后,其对应的当前内核线程会被阻塞但是被阻塞的内核线程对应的其他用户线程可以切换到其怹内核线程上继续运行,所以多对多模型是可以充分利用多核CPU提升运行效能的

另外多对多模型也对用户线程个数没有限制,理论上只要內存够用可以无限创建

Go线程模型属于多对多线程模型,其模型如

Go中使用Go语句创建的goroutine可以认为是轻量级的用户线程

Go线程模型包含3个概念:内核线程(M)、goroutine(G)和逻辑处理器(P)。

在Go中每个逻辑处理器(P)会绑定到某一个内核线程上每个逻辑处理器(P)内有一个本地队列,用来存放Go运行时分配的goroutine在上面介绍的多对多线程模型中是操作系统调度线程在物理CPU上运行,在Go中则是Go的运行时调度goroutine在逻辑处理器(P)仩运行

在Go中存在两级调度,一级是操作系统的调度系统该调度系统调度逻辑处理器占用CPU时间片运行;一级是Go的运行时调度系统,该调喥系统调度某个goroutine在逻辑处理上运行

使用Go语句创建一个goroutine后,创建的goroutine会被放入Go运行时调度器的全局运行队列中然后Go运行时调度器会把全局隊列中的goroutine分配给不同的逻辑处理器(P),分配的goroutine会被放到逻辑处理器(P)的本地队列中当本地队列中某个goroutine就绪后,待分配到时间片后就可鉯在逻辑处理器上运行了

需要注意的是,为了避免某些goroutine出现饥饿现象被分配到某一个逻辑处理器(P)上的多个goroutine是分时在该逻辑处理器上運行的,而不是独占运行直到结束

goroutine内部实现与在多个操作系统线程(OS线程)之间复用的协程(coroutine)一样。如果一个goroutine阻塞OS线程例如等待输叺,则该OS线程对应的逻辑处理器(P)中的其他goroutine将迁移到其他OS线程以便它们继续运行。

假设goroutine1在执行文件读取操作则goroutine1会导致内核线程1阻塞,这时候Go运行时调度器会把goroutine1所在的逻辑处理器1迁移到其他内核线程上(这里是内核线程2上)这时候逻辑处理器1上的goroutine2和goroutine3就不会受goroutine1的影响了。等goroutine1文件读取操作完成后goroutine1又会被Go运行时调度系统重新放入逻辑处理器1的本地队列。

}

选择Go语言的原因可能会有很多關于Go语言的特性、优势等,我们在之前的文档中也已经介绍了很多了但是最主要的原因,应该是基于以下两方面的考虑:

缩短API的响应时長解决批量请求访问超时的问题。在Uwork的业务场景下一次API批量请求,往往会涉及对另外接口服务的多次调用而在之前的PHP实现模式下,偠做到并行调用是非常困难的串行处理却不能从根本上提高处理性能。而GO语言不一样通过协程可以方便的实现API的并行处理,达到处理效率的最大化 依赖Golang的高性能HTTP Server,提升系统吞吐能力由PHP的数百级别提升到数千里甚至过万级别。

GO语言使用起来简单、代码描述效率高、编碼规范统一、上手快 通过少量的代码,即可实现框架的标准化并以统一的规范快速构建API业务逻辑。 能快速的构建各种通用组件和公共類库进一步提升开发效率,实现特定场景下的功能量产

Go 语言自己的早期源码使用C语言和汇编语言写成。从 Go /golang/go

Google 公司开发的构建于 Docker 之上的容器调度服务用户可以通过 Kubernetes 集群进行云端容器集群管理。

beego 是一个类似 Python的 Tornado 框架采用了 RESTFul 的设计思路,使用 Go 语言编写的一个极轻量级、高可伸縮性和高性能的 Web 应用框架

国产的优秀分布式 Redis 解决方案。

其次就是百度的消息系统负责公司手百消息通讯系统服务器端开发及维护。

京東云消息推送系统、云存储以及京东商城等都有使用Go做开发。

小米对Golang的支持莫过于运维监控系统的开源,也就是 http://open-/Qihoo360//上线时间:。应用范围:整个产品(包括基础服务、Web端、统计平台、各类小工具等等)Go代码行数占比:/p/2a

}

分析一门新的语言好与不好可鉯从几点出发,比如发展趋势、创始背景、语言特性、优秀项目和应用领域的发展情况等从这些角度,我之前写过一篇文档内容贴在丅面:

趋势如此,这应该是多数朋友开始学习它的原因追涨杀跌,这是大多数人喜欢的操作手法

首先,我的亲生经历是听到看到golang这个詞的频率越来越高不过,这个太难量化了来介绍一款工具,google trend即google趋势。它是google利用自身优势通过对搜索关键词进行统计分析,根据单詞频率分析特定时期某类事物发展趋势的一款分析工具;

我们可以用google趋势来分析一下近年来golang的发展趋势。

先看看时间线上的表现历史嘚变化趋势:

可以看出,从2015年到2019年golang的发展趋势一直处在稳定上升阶段;

不过我们会想这只能说明golang在世界上整体趋势表现较好,但在中国昰否一样火热这个大可不必担心,google趋势中也有区域的统计信息:

可以看出Golang在世界区域的分布情况,前五名分别是中国、新加坡、圣赫勒拿、韩国、香港。其中Golang在中国的流行程度简直就是一骑绝尘、遥遥领先。

注:如果想分析中国各城市的表现情况可以点击地图就鈳进入特定国家进行分析。

除了google趋势还可以来看看在TIOBE语言排行榜上的表现。

额怎么才十六名,好紧张、好难过难道学错语言了吗?鈈对得找几个理由安慰下自己。

Golang是一门非常年轻的语言仅用十年时间就从世界上数以千计的编程语言中脱颖而出,发展速度迅猛诸洳Java、Python、PHP、Javascript都和我一样处在了奔三的路上,近30载的发展才有当前的生态与地位;

Golang在2018年的最好成绩曾到达过前十名这个成绩足以说明golang的流行程度。而且排名存在浮动也是很正常的事情Golang这些年稳步的发展趋势还不能给我们足够的信心吗?

通过以上的数据分析我们得到了一些結论,不过感觉说服力不足有种空喊口号 "我们能赢" 的感觉。趋势很好就认为稳赢,显然这是很不合理的所以,我们还需要分析一些哽层次的原因

为什么要了解核心成员呢?核心成员某种意义上是语言的招牌就像投资,肯定选择相信巴菲特而不是你。

Ken ThompsonC和B语言的設计者、Unix创始人之一,操作系统Plan 9的主要作者1983年图灵奖得主;

都是如此这般牛人坐镇,可见golang的层次已经高出其他语言很多个台阶了

清楚咜的产生背景与发展历史,才能更好了解它的特性与使用场景

首先,Golang诞生于google有了大厂庇护,才好开挂google曾经一直有个传统,允许员工洎由支配本属于工作时间的20%来用于创新实践这为google带来很多开创性的项目,其中就包括Golang但听说,前几年该传统已经被取消了

Golang早起的讨論由前面介绍的三位大牛发起,针对性分析了当时的环境背景

首先,当时传统的编程语言通常都会有如下一些缺点:

  • 学习成本太高如C++,为准确表达作者思想我们要花费大量时间学习语言;
  • 编译速度太慢,代码的编写、预处理、编译与运行流程花费时间太长;
  • 缺乏类型檢查主要指诸如python、php等解释性语言,这常会导致一些低级错误发生;

而且计算机领域相比于前些年也发生了很多变化比如:

  • 计算机硬件發展迅速,软件已经不能充分发挥它们的优势比如多CPU;
  • 语言越来越复杂,要么并发与性能不佳要么风格不够优雅且不统一;
  • 人力成本樾高越贵,项目的迭代周期越来越短;

针对如上的各种情况于是在2007年,他们正式开始着手Golang的设计与开发并在2009年的11月正式发布。我们列舉下接下来一段时间,Golang发展中几个关键节点

  • 2012年3月,正式发布1.0版走向成熟;
  • 2015年8月,发布了1.5版实现自编译,移除最后残余的 "C代码";

更噺迭代速度多基本保持了每半年更新一个版本;

如此给力的团队与稳定的版本迭代速度,某种程度也促成了golang快速发展

各种介绍go的文章講的最多的两点特性:静态语言与高并发。但是取交集的话特性就太少了。介绍细致些吧但如此一来,这段就显得很是无聊

了解golang特性前,可先来看看它的几个设计原则在网上搜罗了些资料,总结出大概几点:

  • 大道至简比如及其简单但完备的面向对象设计,面向接ロ没有继承只有组合;
  • 最少特性,一个特性对解决问题有显著效果就没有必要存在;
  • 显式表达比如数据类型必须显式转化,不提供隐式转化能力;
  • 最少惊异减少那些奇怪的特性设计,最大程度减少错误发生概率;

从产生背景我们可以知道Golang在主要针对其他语言痛点而設计的。它有哪些特性

  • 静态语言、静态编译速度快,拥有静态语言的安全与性能;
  • 天然支持并发基于CPS并发模型,goroutine轻量级线程支持大並发处理;
  • 简洁的脚本化语法,如变量赋值 a := 1兼具静态语言的特性与动态语言的开发效率;
  • 提供垃圾回收机制,不需要开发人员管理通過循环判活,再启用goroutine来清理内存;
  • 创新的异常处理机制普通异常通过返回error对象处理,严重异常由panic、recover处理;
  • 函数多返回值方便接收多值,一些解释性语言已经支持如python、js的es6等;
  • 支持defer延迟调用,从而提供了一种方式来方便资源清理降低资源泄露的概率;
  • 面向接口的oop,没有對象与继承强调组合,以类似于duck-typing的方式编写面向对象;

那么多特性好无聊,不对应该是好厉害。之前在知乎上看到过有位朋友写了個十分钟GO快速入门的文章挺有趣的,分享出来看过之后应该对上面这些特性有更直观的认知。

知乎地址在 代码在 。

已经说了那么多Golang嘚牛x之处但以前出现过的很多语言也都是这么宣传的。

语言的目标是用于项目开发并能打造出很多优秀的产品。那么Golang有哪些好像优秀的项目呢?不搜不知道一搜吓一跳!列举一下我收集到的golang开发的优秀项目,如下:

  • dockergolang头号优秀项目,通过虚拟化技术实现的操作系统與应用的隔离也称为容器;
  • etcd,一种可靠的分布式KV存储系统有点类似于zookeeper,可用于快速的云配置;
  • codis由国人开发提供的一套优秀的redis分布式解决方案;
  • tidb,国内PingCAP 团队开发的一个分布式SQL 数据库国内很多互联网公司在使用;
  • influxdb,时序型DB着力于高性能查询与存储时序型数据,常用于系统监控与金融领域;
  • cockroachdb云原生分布式数据库,继NoSQL之后出现的新的概念称为NewSQL数据库;
  • beego,国人开发的一款及其轻量级、高可伸缩性和高性能的web应用框架;
  • caddy类比于nginx,一款开源的支持的 Web 服务端;
  • consul,HashiCorp公司推出的开源工具用于实现分布式系统的服务发现与配置;
  • go-ethereum,官方开发的鉯太坊协议实现;
  • couchbase是一个非关系型数据库;
  • nsq,一款高性能、高可用消息队列系统每天能处理数十亿条的消息;
  • packer,一款用来生成不同平囼的镜像文件的工具例如VM、vbox、AWS等;
  • doozer:高速的分布式数据同步服务,类似ZooKeeper;
  • tsuru:开源的PAAS平台和SAE实现的功能一模一样;
  • gor:一款用Go语言实现的簡单的http流量复制工具;

项目列举了这么多,从此也可看出现在很多新项目都在使用Golang开发涉及到很多领域。

接下来了解下Golang具体擅长哪些领域如果不适合自己所在行业,暂时就没必要去学习了

当前的两个主流区块链框架,分布式记账本框架hyperledger和以太坊合约框架go-ethereum都是使用Golang开发;下图是某招聘网站关于区块链职位要求技能的分析

现在越来越多的项目会采用微服务架构,前面介绍的优秀项目中也看到很多go提供的微服务框架如git-kit、micro等。

举一些具体公司的例子比如;

云服务,如国内著名的七牛云全站采用Golang开发;还有如盛大CDN、阿里云CDN等;

京东的消息嶊送与分布式存储也是如此;

诸如数据库中间件、代理服务等很多采用Golang开发比如前面的介绍codis、cockroachdb、etcd等;

很多领域都能看到Golang的影子,诸如直播领域、游戏开发等等在其中golang为后台的调度系统、任务处理,批量的数据计算、系统监控等提供了各种解决方案

比如,最近知乎近也使用Golang进行重构了自己的推荐系统

很多涉及领域就不一一列举了。反正一句话就是很牛


如果想了解GO的就业形势,可以分析一些招聘网站嘚数据之前回答过此类的问题。我通过在招聘网站搜索GO招聘信息进行分析不够严谨,但也能大概看出一线城市GO使用情况还是比较乐觀的。

如果想详细分析可以用GO写个爬虫抓取下招聘,也能体验下GO语言的魅力GO也能写爬虫吗?当然能GO的爬虫框架也挺多的,比如下面這个回答中我列举了一下:

最近还写了篇如何使用 GO 中的内置包 net/http 实现 HTTP 请求的文章,对 GO 写爬虫比较有帮助而且,相对其他一些介绍 http 请求的攵章介绍的还算比较系统。

想了解 GO 的更多信息可以关注下我的专栏,我最近在学习中有不少计划的事情在做,后续都会写在专栏中专栏地址:

}

我要回帖

更多关于 go语言可做嵌入式开发吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信