【Golang】三分钟让你快速了解Go语言为什么我们需要Go语言?

news2024/11/27 22:35:32

在这里插入图片描述

  • 博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: Go语言核心编程
  • 近期目标:写好专栏的每一篇文章

在这里插入图片描述

目录

  • 一、Go语言的诞生
  • 二、Why?——为什么需要Go
    • 2.1:静态类型语言、动态类型语言
    • 2.2:Go——平衡语言差别
    • 2.3:为什么Google创造了Go
  • 三、Go的优点
    • 3.1:Go编译快的原因
      • 3.1.2👩‍💻总结
    • 3.2:Go的性能
    • 3.3:并发编程
    • 3.3:垃圾回收(GC)

一、Go语言的诞生

在这里插入图片描述
Go 语言从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目,即相关员工利用 20% 的空余时间来参与 Go 语言的研发工作。

谷歌的“20%时间”工作方式,允许工程师拿出20%的时间来研究自己喜欢的项目。语音服务Google Now、谷歌新闻Google News、谷歌地图Google Map上的交通信息等,全都是20%时间的产物。

该项目的三位领导者均是著名的 IT 工程师:

  • Robert Griesemer,参与开发 Java HotSpot 虚拟机;
  • Rob Pike,Go 语言项目总负责人,贝尔实验室 Unix 团队成员,参与的项目包括 Plan 9,Inferno 操作系统和 Limbo 编程语言;
  • Ken Thompson,贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范。

二、Why?——为什么需要Go

存在即合理,新事物的产生有它的道理

在了解为什么我们需要Go之前,我们先了解现有语言可以大致分为两大类:

2.1:静态类型语言、动态类型语言

首先,语言根据静态和动态类型分为以下两类分为以下两类:

  • 静态类型语言(Statically Typed Language(强类型语言,编译语言)
    • 💡简介 :在程序编译时变量的数据类型就被确定。且大多数静态语言在编写代码时,都要求声明变量的数据类型
    • 💡特性 :将所有代码编译(compile)完成,生成可执行文件,再执行。
    • 💡优点 高效: 运行速度快,便于调试,类型安全,结构规范
    • 💡缺点 :每次改动都需要重新编译,开发和学习效率低
    • 💡代表语言 :C,C++,Java(半编译,半解释),Pascal

👁️‍🗨️总结:静态类型语言,如C++,执行效率高,但编译、学习、开发效率低

  • 动态语言(弱类型语言
    • 💡简介 :程序在运行的时候可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化,判断变量的类型是在程序运行的时候完成的
    • 💡特性 变量声明时无需指定类型,会在该变量第一次将数据赋给该变量时,在内部记下该数据类型。将代码按行解释(launch)并允许。
    • 💡优点: 代码简洁(不需要写非常多的类型相关的代码)、可以把更多精力放在业务逻辑的处理上(完成相同逻辑的程序,使用ruby或者Python类动态语言所需要的代码量只有Java实现版本的1/10,相比C/C++差距更大)、更加灵活易于开发、学习、当有改动时无需重新编译,直接解释运行
    • 💡缺点 :不方便调试,命名不规范导致可读性差、运行速度慢
    • 💡代表语言 :PHP、Python、JavaScript

👁️‍🗨️总结:学习、开发效率高,执行效率低

补充:之前学习Java的时候,有一个概念是多态,其实本质就是一个变量的不同形态(类型),像静态语言,不能给变量赋予不同类型的值,需要采取:继承、接口等方式实现多态。而动态语言采用dynamic typing,就是说变量在运行期间是可变的,意味着对象的多态性是与生俱来的

2.2:Go——平衡语言差别

根据上面分析,

  • 传统语言如静态语言C++,学习和开发效率低(命名规范等等,需要花很多时间取学习,才能上手一个程序来写个程序实现某个功能),同时编译花费时间长,编译效率低编写——>编译——>运行这个完成这个链条的周期较长)
  • 动态语言,比如Python,没有强类型的约束,很多问题在程序运行起来才发现,虽然编写——>运行,节省了静态语言编译效率低的问题,但是这种类型相关的低级错误,应该交给编译器来发现

总之,简单来说,在Go之前,没有语言可以兼顾执行效率、开发效率

当然,这只是Go诞生的其中一点

下面列举Goggle公司创造Go语言的原因:

2.3:为什么Google创造了Go

  • 硬件技术更新快,机器性能大幅提高。目前主流的编程语言落后与硬件,不能合理利用多核多CPU的优势提高软件性能
  • 现有编程语言:风格不统一、技术能力不够、处理大并发不够好。且软件系统复杂度高,数以万计的代码,维护成本高,需要足够简洁高效的编程语言,提高开发效率,降低运维成本
  • c/c++项目,虽然运行速度快,但编译速度慢,且存在内存泄漏的问题
  • 部署平台各式各样,交叉编译难
  • 执行效率、开发效率上达到平衡

🤦🏻‍♀️为了解决以上问题,Goggle公司就自己造了个轮子——GO

三、Go的优点

💡Go的主要优点

  • 编译速度快
  • 执行速度快
  • 内存管理
  • 并发编程(多核CPU

3.1:Go编译快的原因

👉Go的编译器:
最初设计团队的想法是实现Go语言编译的前端,是基于C的gcc的编译器来编译成机器代码。这个前端编译器是目前Go的编译器之一:gccGo

  • 上面一行是“编译器前端”组成部分
  • 下面一行是“优化”+“编译器后端”组成部分
    在这里插入图片描述

在Go的1.5中,Go团队使用Go编写了Go的编译器(叫作自举),对比与gccgo:1,提高了编译速度,虽然执行速度略有下降;3,增加可编译平台

👁️‍🗨️C++为什么慢?
C++是也可以用gcc编译器编译的,所以从编译器角度来说,应该不是编译器使Go更快。很大程度是是Go语言的设计本身

⚠注意:这里我们比较编译速度都是比较的静态编译速度

🫐 Go语言·默认·编译方式是·静态编译·不依赖任何动态链接库,可以避免各种动态链接库依赖的问题;编译好后,只要平台是一致的(linux amd64),就可以任意部署,完全不用考虑链接库依赖问题;

💁🏻‍♂️静态编译&动态编译

  • 💙静态编译

    • 简介: 编译器在编译可执行文件时,会把该文件中使用到的链接库提取出来,链接打包进可执行文件中。编译之后的结果只生成一个可执行文件。

    • 优点:不需要管理不同版本库的兼容问题

  • 🧡动态编译

    • 简介: 可执行文件需要附带独立的库文件,不打包库到可执行文件中,减少可执行文件体积,编译完成,程序执行时,执行到了,再从库里面调用。
    • 优点:减少内存和存储占用(不同程序共享一个库)

将外部代码嵌入到当前生成的可执行文件中的就是静态编译,以跳转的方式引用外部代码的就是动态编译

在说回C++为什么慢?

  • include头文件
  • 模板编译

关于模板编译:首先,C++的模板使用,是为了支持泛型编程(这篇文章说的很清楚,这里就不重复造轮子了)。可以看到。编写不同类型的泛型函数,对于编码者来说,确实很方便,但是从那篇文章中,也有可能给编译器增加不必要的编译负担:1,代码膨胀,导致编译时间变长,2,容易出现模板编译错误,且错误信息不易定位

💁🏻‍♂️优化:

  • 基于C/C++慢的第一个引入头文件的问题,后生的语言大部分采用import module代替include 头文件的方式——Go采用的也是import module方式(下面是基于C的几种引入头文件的对比)

    • #include:  include做的事情其实就是简单的复制粘贴,将目标.h文件中的内容一字不落地拷贝到当前文件中,并替换掉这句include。
    • #import:实质上做的事情和#include是一样的,只不过OC为了避免重复引用可能带来的编译错误(这种情况在引用关系复杂的时候很可能发生,比如B和C都引用了A,D又同时引用了B和C,这样A中定义的东西就在D中被定义了两次,重复了),而加入了#import,从而保证每个头文件只会被引用一次。
      如果想深究,import的实现是通过#ifndef一个标志进行判断,然后在引入后#define这个标志,来避免重复引用的
    • PCH(PreCompiled Header): 实质上import也还是拷贝粘贴,这样就带来一个问题:当引用关系很复杂,或者一个头文件被非常多的实现文件引用时,编译时引用所占的代码量就会大幅上升(因为被引用的头文件在各个地方都被copy了一遍)。
        为了解决这个问题,C系语言引入了预编译头文件(PreCompiled Header),将公用的头文件放入预编译头文件中预先进行编译,然后在真正编译工程时再将预先编译好的产物加入到所有待编译的Source中去,来加快编译速度。
    • import Modules: 理论上说,想要提高编译速度,可以把所有头文件引用都放到pch中。但是这样面临的问题是在工程中随处可用本来不应该能访问的东西,而编译器也无法准确给出错误或者警告,无形中增加了出错的可能性。Modules相当于将框架进行了封装,然后加入在实际编译之时加入了一个用来存放已编译添加过的Modules列表。如果在编译的文件中引用到某个Modules的话,将首先在这个列表内查找,找到的话说明已经被加载过则直接使用已有的,如果没有找到,则把引用的头文件编译后加入到这个表中。这样被引用到的Modules只会被编译一次,但是在开发时又不会被意外使用到,从而同时解决了编译时间引用泛滥两方面的问题。
  • 基于第二个问题,Go根本没有将泛型编程纳入设计框架,根本不存在模板编译带来的开销。(不过Go1.18中已经支持泛型了)

3.1.2👩‍💻总结

Go编译速度快的几个原因

  • 使用import引用管理方式
  • 没有模板编译负担
  • 1.5版本后编译器的优化
  • 语言本身关键字很少

3.2:Go的性能

Go的执行速度,可以参考一个语言性能测试数据网站👉 he Computer Language Benchmarks Game。

  • Go的性能接近C++
  • 算法时间花销和Java接近,但内存花销远低于Java
  • 和python 对比,时间和内存开销都优秀

3.3:并发编程

上面我们提到,硬件技术更新快,机器性能大幅提高(eg:多核CPU)。Go语言设计其实初衷也是为了追平编程语言和硬件之间的差距。Go很多特性都是为了并发而生(一些语言也支持并发,但是是一些后期库支持并发和第三方库支持并发,这和Go天生并发的设计是不同的)

  • Go的并发量可以比大部分语言里普通的线程实现要

    这受益于轻量级的Goroutine,轻量化主要是它所占用的空间要小得多,例如64位环境下的JVM,它会默认固定为每个线程分配1MB的线程栈空间,而Goroutines大概只有4-8KB,之后再按需分配。足够轻量化的线程在相同的内存下也就可以有更高并发量(服务器CPU还没有饱和的情况下),同时也可以减少很多上下文切换的时间开销。但是如果你的每个线程占用空间都非常大时(比如10MB,当然这是非常规需求的情况下),Go的轻量化优势就没有那么明显了。

  • 语言设计上支持了并发

3.3:垃圾回收(GC)

垃圾回收(英语:Garbage Collection,缩写为GC),在计算机科学中是一种自动的存储器管理机制。当一个计算机上的动态存储器不再需要时,就应该予以释放,以让出存储器,这种存储器资源管理,称为垃圾回收。垃圾回收器可以让程序员减轻许多负担,也减少程序员犯错的机会

在使用Go或者其他有垃圾回收机制的语言(如Java),无需像C/C++一样进行手动释放内存空间(free()/delete)

  • 优点:方便
  • 限制:
    • 暗箱操作的不透明性
    • GC处理的性能开销
    • 对于性能要求高的场景,需要进行主动释放和优化(eg:自定义内存池)

如果对你有帮助还请:点赞+关注+收藏

如果文中有不足还请多多指出

关注我,一起学习Golang!
在这里插入图片描述

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

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

相关文章

Pytorch基础 - 3. torch.utils.tensorboard

目录 1. 简介 2. 基本步骤 3. 示例1 - 可视化单条曲线 4. 示例2 - 可视化多条曲线 5. 示例3 - 可视化网络结构 1. 简介 Tensorboard是Tensorflow的可视化工具,常用来可视化网络的损失函数,网络结构,图像等。后来将Tensorboard集成到了P…

wps如何修改已经存在的目录标题内容?

如需了解更多办公应用的相关知识,可进入到赛效官网查看应用资讯或者应用问答栏目。 在WPS文档中,为方便大家查看文档中的内容,可以给文档内容添加目录,很多人由于对文档功能不太熟悉,所以当目录生成以后,想…

高效又稳定的ChatGPT大模型训练技巧总结,让训练事半功倍!

文|python前言近期,ChatGPT成为了全网热议的话题。ChatGPT是一种基于大规模语言模型技术(LLM, large language model)实现的人机对话工具。现在主流的大规模语言模型都采用Transformer网络,通过极大规模的数…

Day941.仓库版本管理 -系统重构实战

仓库&版本管理 Hi,我是阿昌,今天学习记录的是关于仓库&版本管理的内容。 当代码以及团队达到一定的规模以后,这会给项目仓库和版本的管理带来诸多问题。 一张常见问题的表格,不妨“对号入座”,看看项目有没…

【常见CSS扫盲雪碧图】从源码细看CSS雪碧图原理及实现,千字详解【附源码demo下载】

【写在前面】其实估计很多人都听过雪碧图,或者是CSS-Sprite,在很多门户网站就会经常有用到的,之所有引出雪碧图这个概念还得从前端加载多个图片时候页面闪了一下说起,这样给人的视觉效果体验很差,也就借此机会和大家说…

Linux查看串行端口

查看串口驱动 cat /proc/tty/driver/serial查看串口设备 dmesg | grep ttyS*[rootlocalhost driver]# cat /proc/tty/driver/serial serinfo:1.0 driver revision: 0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 1: uart:16550A port:000002F8 irq:3 tx:0 rx:0 CTS|DSR|CD 2:…

攻防世界-inget(简单的SQL注入、万能密码)

目录 1、手工注入(万能密码原理) 2、sqlmap实现 3、常用参数 1、手工注入(万能密码原理) 打开链接,提示输入id并尝试绕过 尝试一下万能密码,使用逻辑语句使结果返回 构造payload /?id or 我们这里是…

Java虚拟机内存区域

Java虚拟机所管理的内存将会包括以下几个运行时数据区域 程序计数器 是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要通过更改这个计数器的值来改变下一条需要执行的字节码。 由于各个线…

DAY 35 sed文本编辑器

文本三剑客:都是按行读取后处理。 grep 过滤行内容 awk 过滤字段 sed 过滤行内容;修改行内容 sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 sed编辑器可以根据命令来处理数据流中的…

Shell编程(二)

上一章: Shell编程_做测试的喵酱的博客-CSDN博客 七、ping shell脚本,是一个面向过程的编程语言,没有类和对象的概念。用的最多的就是函数。 查看当前服务,是否能ping通baidu ping www.baidu.com [rootecs-39233 dev]# ping ww…

眺望2023:房企“三大护法”如何助力穿越周期?

2022 年的地产行业尤为艰难,土地和商品房成交量明显下滑,许多房企的业绩都呈现收缩态势。 不过,今年以来房地产市场似乎出现企稳信号。国家统计局数据显示,今年1~2月全国商品房销售面积和销售额的下跌幅度明显收窄,住…

18-java单列集合

java单列集合1.集合体系结构1.1 单列集合1.2 双列集合2. 单列集合体系结构3.Collection集合顶层接口3.1 Collection的遍历方法3.1.1 迭代器遍历3.1.2 增强for遍历3.1.3 Lambda表达式4. List单列集合4.1 List4.1.1 List集合特点4.1.2 List集合的特有方法4.1.3 List集合遍历方法4…

计算机组成原理实验三-----系统总线和具有基本输入输出功能的总线接口实验

总线是计算机中连接各个功能部件的纽带,是计算机各部件之间进行信息传输的公共通路。 总线不只是一组简单的信号传输线,它还是一组协议。他有两大特征 分时: 同一总线在同一时刻,只能有一个部件占领总线发送信息,其他部件要发送信…

游戏基础—Android平台进程模块信息获取

记得学习编程时的第一个helloworld程序&#xff1a; #include<stdio.h> Int main(int argc, char **argv) { printf(“Hello World”); return 0; } 打印” Hello World”&#xff0c;使用的是printf函数。但是&#xff0c;我们并没有去实现printf函数的功能&#xff0…

javascrip语法

JavaScript 语法涉及到很多方面&#xff0c;以下是常见的详细语法&#xff1a; 1. 变量 变量用于存放值&#xff0c;关键字 var 可以定义变量。 // javascript var x 5; // 定义变量 x&#xff0c;并赋值为 52. 数据类型 JavaScript 中有多种数据类型&#xff0c;包括&…

iOS 紧急通知

一般通知 关于通知的各种配置和开发&#xff0c;可以参考推送通知教程&#xff1a;入门 – Kodeco&#xff0c;具有详细步骤。 紧急通知表现 紧急通知不受免打扰模式和静音模式约束。当紧急通知到达时&#xff0c;会有短暂提示音量和抖动&#xff08;约2s&#xff09;。未锁…

一文速学数模-K-means聚类算法实战:信用卡用户画像聚类分析

目录 前言 一、用户画像概述 1.用户画像 2.为何用聚类算法作用户画像 二、数据质量校验 1.数据背景 2.数据说明 三、数据预处理 1.数据空缺值检验 2.数据归一化 四、K-means聚类 step1:选取K值 手肘法 step2:计算初始化K点 step3:迭代计算重新划分 五.画像分析 …

【LeetCode:221. 最大正方形 | 暴力递归=>记忆化搜索=>动态规划 | 二维dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Flutter - 实现防抖和节流

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 什么是防抖和节流&#xff1f; 函数节流&#xff08;throttle&#xff09;与 函数防抖&#xff08;debounce&#xff09;都是为了限制函数的执行频次&#xff0c;以…

AgentGPT,免费易用的 Auto-GPT 平替

你问 ChatGPT 答&#xff0c;属于单线问答式交互。但如果你问Auto-GPT&#xff0c;他会分解成N个任务&#xff0c;并且在遇到任务无法完成后&#xff0c;会尝试其它的方式来完成任务&#xff0c;很像老板交待你一个任务&#xff0c;中间的过程他不过问&#xff0c;遇到问题你自…