如题,为啥选用Go语言?

本文将介绍该语言诞生的原因,核心特性以及应用场景等。


文章目录

  • 前言
  • Go诞生的原因
  • Go的编码风格
  • Go的核心特性
  • Go的应用场景

前言

Go语言为什么一会叫Go,一会又叫Golang?

这是因为Go的全名为Go language,简称可以为Golang或者Go。而Go表示的意思有太多了,比如在英文里表示很多意思,很难让人们想到编程语言,所以一般在搜索时可以以Golang作为关键字。但是在这篇文章里,两者等价的,所以有时可能称为Go,有时是Golang。


Go诞生的原因

Google在创造Go的原因:

  • 计算机硬件的发展特别快速,性能提高的很快。目前主流的编程语言发展明显落后与硬件的发展,不能够合理地利用多核CPU以提升软件性能。
  • 软件系统的复杂度越来越高,维护成本也越来越高。目前缺乏一个足够简洁高效的编程语言
  • 企业运行维护很多C/C++项目,这两个语言虽然运行速度很快,但是编译速度很慢,同时还存在内存泄露的问题需要解决。这使得我们程序员再解决业务的同时,还要分出精力去处理业务之外的事情。

Go的编码风格

这里摘选一个GitHub仓库

最近十年来,C/C++在计算领域没有很好得到发展,并没有新的系统编程语言出现。对开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译,如C++;要么执行低效,但拥有有效的编译,如.NET、Java;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go就横空出世了。

传统的语言比如c++,大家花费太多时间来学习如何使用这门语言,而不是如何更好的表达写作者的思想,
同时编译花费的时间实在太长,对于编写-编译-运行这个链条来说周期太长。动态语言如Python,
由于没有强类型的约束,很多问题需要在运行时发现,这种低级错误更应该交给编译器来发现。
执行效率 execution speed:C/C++ > Java > PHP 开发效率 developing efficiency: PHP > Java > C/C++

简单一句话,为了兼顾运行速度与开发效率。可以看成Go=C+python。

因为它本质上是个静态语言,不过编译器给了开发者许多“语法糖”,所以又兼备动态语言的特点。


Go的核心特性

  • 并发编程:这个我觉得是最重要的特点,人家天然就支持并发。诶,有朋友可能会讲了,Java不也支持并发吗?Java是支持,它还有个关键字synchronized可以解决并发中的共享变量问题呢!但是人家底层还要涉及到内核层面的开销,所以一些锁特别“重”。而Go和它相比开销就小的多。

    不仅如此,还有个重要的点,人家是多线程。Go是多携程编程。什么是携程。携程可以理解为更加轻量的线程(gorountine),可以高效的处理并发,更加高效地利用多核。 一次可以在程序中启动成千上万个gorountine,从而高效地完成任务。

    而gorountine之间的通信采用独特的chanel机制,确保gorountine之间可以通信。

  • 内存回收(gc):这个大家就比较熟悉了,学过Java的朋友不陌生。我们在开发程序时无须去考虑内存问题,因为有jvm会帮我们自动释放内存。而Go也同理,它会帮我们自动回收。

    GC过程:先stop the world,扫描所有对象判活,把可回收对象在一段bitmap区中标记下来,接着立即start the world,恢复服务,同时启动一个专门的goroutine,回收内存到空闲list中以备复用,不物理释放,物理释放由专门线程定期来执行。GC瓶颈在于每次都要扫描所有对象来判活。待收集的对象数目越多,速度越慢。GC性能可能会随着版本不断更新会不断优化。只需要new分配内存,不需要释放。

    这里插播一下,关于Go的内存分配

    在初始化阶段直接分配一块大内存区域,大内存被切分成各个大小等级的块,放入不同的空闲list中。对象分配空间时从空闲list中取出大小合适的内存块。内存回收时,会把不用的内存重放回空闲list。空闲内存会按照一定策略合并,以减少碎片。

  • 网络编程:这里说白了就是像其它语言一样,也提供了丰富便捷的网络编程接口。Go语言还自带了高性能的HttpServer,通过简单的几行代码调用,就可以得到一个基于协程的高性能Web服务,维护成本极低,没有任何依赖。

    socket用net.Dial(基于tcp/udp,封装了传统的connect、listen、accept等接口);
    http用http.Get/Post();
    rpc用client.Call(‘class_name.method_name’, args, &reply);

  • 函数多返回值:不仅返回本来的值,还可以返回一个error对象,用来出现异常时使用。这也是Go推荐的编程风格。有时候会有这种需求。

  • 语言交互性:可以调用其它语言编译之后的库,比如C。

  • 异常处理:Go语言不支持try catch这样的结构化的异常解决方式。Go语言提供的异常处理方式是:如果是普通异常,查看被调用方返回的error对象;如果是严重异常,指的是中断性panic(比如除0),使用defer…recover…panic机制来捕获处理。严重异常一般由Go语言内部自动抛出,不需要用户主动抛出,避免传统try…catch写得到处都是的情况。

    三个重要关键字defer、panic、recover;
    defer是函数结束后执行,呈先进后出;
    panic是程序出现无法修复的错误时使用,但会让defer执行完;
    recover会修复错误,不至于程序终止。当不确定函数不会出错时使用defer+recover。

  • 除此之外还有一些其它的特性了,比如上文也出现的defer机制,本质上是延迟执行。个人觉得有点像Java中的finally和守护线程。还有一些类型推导等特性,各位在具体学习中会感受到,这里不多介绍了。


Go的应用场景

主流的应用场景有那么几个:

  1. 区块链开发:这个怎么讲呢。区块链本质上是一个分布式账本技术,就是人人都可以参与记录。而编码实现所用到的技术栈就是Golang。目前来看,也算是未来的一个趋势吧。
  2. 游戏/web端开发:先说游戏这块。举个例子,平时咱们打lol时,队友上去打出了爆炸伤害,我们可以马上看到。这里就可以看成数据的实时同步了,有个专业的词,叫数据通道。而Golang可以实现这个数据通道。而web开发,这个就不用多说了吧,人家也可以做web应用,甚至于当下主流的微服务应用也能驾驭。
  3. 云计算/云服务后台应用:这里主要涉及到一些云上的东西,如京东的消息推送和分布式文件系统,都是采用Golang来实现的。还有盛大的CDN(内容分发网络)等等。因为Golang的计算机能力比较强。

不仅如此,Golang还被用来开发一些中间件。比如大名鼎鼎的dockerk8s等。人家就是用Golang来做的。还有微服务注册中心consul等等。


之前在网上看到一个总结,未来的软件系统应用可能是C/C++负责底层实现,Java负责高层(即业务层)的编码实现,而Go可以来负责中间层的实现。目前来看的确有这种趋势。

但是和其它语言相比,个人还是觉得Go的特性虽然足够诱人,但是国内的社区活跃度还是不够,这里也希望各位学习该语言的小伙伴可以一块记录下博客或贡献开源代码,一起为这个社区贡献出一份力。

文中有些内容摘选自互联网。最后,感谢您的观看

初始Golang---为啥选用Go语言?相关推荐

  1. 【Golang 基础】Go 语言的程序结构

    Go 语言的项目结构    一般,一个 Go 项目在 GOPATH 下,会有如下三个目录 . ├── bin // 存放编译后的可执行文件 ├── pkg // 存放编译后的包文件 └── src / ...

  2. golang 切片 接口_Golang语言常用关键字之 make 和 new

    上一章中对于golang的语言基础说明如下: 1 函数调用 2 接口 3 反射 接下来我们来对golang的常用关键字进行说明,主要内容有: 1. for 和 range 2. select 3. d ...

  3. go 调用c语言,golang之调用C语言代码

    此篇教程只是简单的描述怎么使用以及遇到的一些错误 我写的实例,C语言与golang在同一个文件中,并没有分开. 我这里演示两个例子: ⑴ 调用C语言函数打印"Hello World" ...

  4. gRPC详细入门教程,Golang/Python/PHP多语言讲解

    一.gRPC是什么? gRPC,其实就是RPC框架的一种,前面带了一个g,代表是RPC中的大哥,龙头老大的意思,另外g也有global的意思,意思是全球化比较fashion,是一个高性能.开源和通用的 ...

  5. Golang面试宝典——Go语言实现排序算法之冒泡排序

    关于Golang面试宝典 最近几年,Go的热度持续飙升,国内外很多大公司都在大规模的使用Go.Google是Go语言诞生的地方,其他公司如Facebook.腾讯.阿里.字节跳动.百度.京东.小米等都在 ...

  6. golang goroutine实现_Go语言潜力有目共睹,但它的Goroutine机制底层原理你了解吗?...

    来源 | 后端技术指南针(ID:gh_ed1e2b37dcb6) Go语言的巨大潜力有目共睹,今天我们来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人的特性了,理解它对于掌握Go语 ...

  7. golang语法系列3-Go语言初始化结构体的成员变量

    1.使用"键值对" 初始化结构体 1.1.键值对初始化结构体的书写格式 键值对初始化的格式如下: ins:= 结构体类型名{字段1:字段1的值,字段2:字段2的值,... } 结构 ...

  8. 四、golang类型讲解--go语言学习笔记

    擅自使用了七牛大牛们的PPT资料,希望不要怪罪,这里谢谢大牛们的分享. 映射 map 一个"键-值"对 关键点:注意并发读写情况,上锁 不能对未初始化的 map 进行写,会抛异常( ...

  9. linux环境搭建golang服务器,Linux下golang环境搭建-Go语言中文社区

    1.首先从使用wget https://storage.googleapis.com/golang/go1.12.linux-amd64.tar.gz命令下载安装包,可以根据自己的需要选择版本. 2. ...

最新文章

  1. java将一个数转成36进制的数_编程实现将一个N进制数转换成M进制数。
  2. 让尸体说话-法医密档
  3. 3.1亿美元融资之后,重估文远知行
  4. python双引号报错_Python中select语句中的双引号”“怎么处理
  5. 代码回滚:Reset、Checkout、Revert 的选择
  6. Python单例模式中几种实现及优化方法
  7. thinkphp的使用——隐藏index.php
  8. Laravel核心解读 -- 外观模式
  9. 纠前误码率与信噪比 matlab,信噪比与误码率关系.pdf
  10. Frameworks.Entity.Core 1
  11. PostgreSQL SQL 语言:查询
  12. 如何搭建个人博客或企业官网
  13. C++ 输出Unicode字符的正确方法
  14. Java对接百度翻译API
  15. 【Python | 杂代码】Python 里Blueprint(蓝图)的运用
  16. 【圣诞节给爱的人打印一颗圣诞树吧】超详细代码实现——圣诞树打印
  17. simulink AWGN信道使用要点
  18. Elesticsearch(es)聚合搜索(入门到精通)4
  19. Python使用Plotly绘图工具,绘制散点图、线形图
  20. poj3518(Prime Grap 欧拉筛+二分)

热门文章

  1. JS label关键字详解
  2. Android 自定义ImageView实现圆角图片
  3. C++PRIMER PLUS第六版课后编程答案 4.6-4.10
  4. 国家网络安全宣传周之代表厂商盘点——上海浪擎引领国内灾备产业发展潮流...
  5. 解决word之无法插入公式,公式图标灰色
  6. 《Python编程快速上手—让繁琐工作自动化》第17章
  7. 1046-最小时间差
  8. 圣火中原之历史回顾, 曾经的“吉鸿昌”
  9. 单片机三种烧录方式ISP、IAP和ICP有什么不同?
  10. 个人台式计算机上常用的操作系统,几个常用的操作系统简介