Go语言认识

Go语言认识

  • 1. Go语言的设计背景
  • 2. Go语言的历程
  • 3. Go语言对比分析
  • 4. Go语言未来的发展规划
  • 5. 要不要选择Go

关注 go博客 直接了解第一手资料。
go文档 了解go的全貌。

1. Go语言的设计背景

Go语言(也称为Golang)是由Google开发的一种编程语言。它的设计背景源于对现有编程语言的不足之处的反思和对新兴需求的追求。以下是Go语言的设计背景的详细解释:

  1. 并发编程需求:随着计算机硬件的发展,多核处理器和分布式系统变得越来越普遍。传统的编程语言在处理并发编程时存在一些困难,如共享内存并发模型的复杂性和线程安全问题。Go语言通过引入轻量级的Goroutine和通道(Channel)机制,使并发编程变得更加简单和安全。

  2. 大规模软件开发:在大规模软件开发中,代码的可维护性和可读性非常重要。然而,一些传统的编程语言在这方面存在一些问题,如复杂的语法和过多的语言特性。Go语言通过简洁的语法和清晰的设计原则,鼓励编写简洁、可读性强的代码,以提高软件的可维护性。

  3. 快速编译和执行:在软件开发过程中,快速的编译和执行速度可以提高开发效率。一些编程语言在编译和执行速度方面存在一些问题,如编译时间长或执行效率低。Go语言通过优化编译器和运行时,以及采用静态链接的方式,实现了快速的编译和执行速度。

  4. 内存管理:传统的编程语言在内存管理方面存在一些问题,如手动内存管理容易出错,自动垃圾回收机制可能导致性能问题。Go语言引入了一种称为"垃圾回收器"的自动内存管理机制,可以在不牺牲性能的情况下自动回收不再使用的内存。

  5. 跨平台支持:在现代软件开发中,跨平台支持变得越来越重要。一些编程语言在不同平台上的兼容性和可移植性方面存在一些问题。Go语言通过提供跨平台的编译器和运行时环境,使得开发者可以轻松地在不同的操作系统和硬件平台上开发和部署应用程序。

  6. 开发者友好性:Go语言的设计目标之一是提供一种开发者友好的编程语言。它通过提供简洁的语法、清晰的错误信息和丰富的标准库,使得开发者可以更轻松地学习和使用该语言。

总结起来,Go语言的设计背景可以归结为对并发编程需求、大规模软件开发、快速编译和执行、内存管理、跨平台支持和开发者友好性的关注。这些设计原则使得Go语言成为一种简洁、高效、可靠和易于使用的编程语言。

  1. Go语言官方网站:https://golang.org/
  2. “The Go Programming Language”(Go语言官方书籍):https://golang.org/doc/
  3. “Go at Google: Language Design in the Service of Software Engineering”(关于Go语言设计的论文):https://talks.golang.org/2012/splash.article
  4. “Go: A Systems Programming Language”(关于Go语言设计的演讲视频):https://www.youtube.com/watch?v=rKnDgT73v8s

2. Go语言的历程

  • 2007年:Go语言的起源可以追溯到2007年。当时,Google的工程师们(包括Robert Griesemer、Rob Pike和Ken Thompson)开始思考如何设计一种新的编程语言,以解决一些现有编程语言的问题,并满足Google内部的需求。

  • 2009年:Go语言的首个公开版本(Go 1)于2009年11月发布。这个版本是一个实验性版本,用于收集反馈和改进语言设计。Go语言的设计目标是提供一种简洁、高效、可靠和易于使用的编程语言,适用于大规模软件开发和并发编程。

  • 2010年:Go语言的发展开始引起广泛关注。在2010年,Go语言的用户社区开始形成,许多开发者开始尝试使用Go语言进行项目开发,并提供了一些开源项目和库。

  • 2012年:Go语言的发展进入了一个新的阶段。在2012年3月,Go语言的第一个稳定版本(Go 1)发布。这个版本的发布标志着Go语言的正式进入生产环境,并承诺向后兼容性。

  • 2014年:Go语言的发展继续迅速。在2014年,Go语言的第一个大版本升级(Go 1.4)发布。这个版本引入了一些重要的改进,如增强的垃圾回收器、更好的并发性能和更好的工具链。

  • 2016年:Go语言的发展持续推进。在2016年,Go语言的第二个大版本升级(Go 1.7)发布。这个版本引入了一些新特性,如上下文(Context)包、并发安全的Map类型和更好的编译器优化。

  • 2018年:Go语言的发展继续取得重要进展。在2018年,Go语言的第三个大版本升级(Go 1.11)发布。这个版本引入了一些重要的改进,如模块化支持、WebAssembly支持和更好的性能优化。

  • 2020年:Go语言的发展仍在继续。在2020年,Go语言的第四个大版本升级(Go 1.15)发布。这个版本引入了一些新特性,如更快的编译速度、更好的垃圾回收和更好的错误处理。

  • 2022年:Go语言支持了泛型。在2022年,Go 1.18 发布,让Go语言支持了泛型,在开发通用性的逻辑时,不在使用interface{}万能类型来传参,更好的处理通用逻辑中的类型。

Go语言的发展历程可以追溯到其诞生的初期,经历了多个版本的迭代和改进。随着时间的推移,Go语言在开发者社区中获得了广泛的认可和使用,并在许多领域得到了应用,包括网络服务、分布式系统、云计算和人工智能等。

比较有意思的是,如果你开发过Java,那么你一定知道NPE异常,在2023年8月发布的Go 1.21.0 中,新增了一个错误*runtime.PanicNilError,可以认为这是Go版本的NPE。(大道同归~)

“A brief history of Go”(关于Go语言历史的官方博客文章):https://blog.golang.org/10years

go 发布历史 查看全部版本,以及每个版本go的特性。

3. Go语言对比分析

  1. 性能:
    Go语言:Go语言以高性能而闻名,其编译器和运行时系统的设计使其能够有效地利用多核处理器。它具有轻量级线程(goroutine)和通信机制(channel),使并发编程变得简单而高效。
    Java:Java的性能通常比Go语言稍低,但它具有强大的即时编译器和优化技术,可以在运行时进行性能优化。
    C和C++:C和C++是编译型语言,执行效率非常高。它们可以直接操作内存,提供了底层控制的能力,适合开发对性能要求较高的应用程序。

  2. 并发支持:
    Go语言:Go语言原生支持轻量级线程(goroutine)和通信机制(channel),使得并发编程变得简单而高效。
    Java:Java通过线程和锁机制来支持并发编程,但相对于Go语言的goroutine和channel,Java的并发编程模型更为复杂。
    Python:Python的并发支持相对较弱,但通过使用第三方库(如concurrent.futures和asyncio)可以实现并发编程。
    C和C++:C和C++本身没有原生的并发支持,但可以使用线程库(如pthread)来实现并发编程。
    JavaScript:JavaScript通过事件循环和异步编程模型来支持并发操作,使得在浏览器中处理大量并发请求变得容易。

  3. 生态系统和库支持:
    Go语言:尽管Go语言的生态系统相对较年轻,但它拥有丰富的标准库和活跃的开源社区。许多知名的项目和库(如Docker、Kubernetes和gin)都是使用Go语言开发的。
    Java:Java拥有庞大而成熟的生态系统,具有丰富的类库和框架,适用于各种应用场景。一些知名的Java框架包括Spring、Hibernate和Apache Struts。
    Python:Python拥有强大的第三方库和框架,可以快速实现各种功能。一些知名的Python库和框架包括NumPy、Django和Flask。
    C和C++:C和C++拥有丰富的类库和工具,可以用于系统级编程、嵌入式开发和游戏开发等领域。
    JavaScript:JavaScript在前端开发中具有广泛的应用,拥有丰富的类库和框架,如React、Angular和Vue.js。
    PHP:PHP在网页开发领域具有广泛的应用,拥有许多成熟的框架和类库,如Laravel和Symfony。

  4. 学习曲线:
    Go语言:Go语言的语法简洁明了,学习曲线相对较低,适合初学者入门。
    Java:Java是一种面向对象的语言,学习曲线较陡峭,需要掌握面向对象的概念和复杂的语法规则。
    Python:Python的语法简单易读,学习曲线相对较低,适合初学者入门。
    C和C++:C和C++的语法相对较复杂,需要掌握指针、内存管理等底层概念,学习曲线较陡峭。
    JavaScript:JavaScript的语法相对较简单,但在处理异步编程和浏览器API时可能会有一些复杂性。
    PHP:PHP的语法相对较简单,学习曲线较低,适合快速入门。

Go语言比Java快,比c/c++简单,不需要直接管理内存,比Python更容易实现大型项目,只有25个关键字,更容易上手等等的优点;
但是也存在不足,比如没有Java那么强大的生态,没有c/c++那么深的基础,没有php和js以及Python的动态特性,糟糕的异常处理等等。
没有最好的语言,只有合适不合适。

4. Go语言未来的发展规划

提高性能和并发能力:
Go语言以其出色的性能和并发能力而闻名。未来,Go语言的发展将继续致力于提高性能和并发处理能力,以满足不断增长的需求。这包括改进编译器、优化运行时、提高垃圾回收机制等方面的工作。
而且事实上每一次Go版本的发布,都伴随着编译和运行时的性能优化,或者是内存回收的优化。

扩展应用领域:
目前,Go语言已经在许多领域得到了广泛应用,包括网络服务、云计算、容器技术等。未来,Go语言将继续扩展其应用领域,进一步深入到人工智能、大数据、区块链等新兴领域。
(我个人认为云原生可能是一个方向)

生态系统的发展:
Go语言拥有一个活跃的开源社区,其中包括许多优秀的第三方库和框架。未来,Go语言的生态系统将继续发展壮大,为开发者提供更多的工具和资源。这将有助于提高开发效率,加速应用的开发和部署。
相比较Java,Go的生态还是差距非常大,而且基本上Go的第三方库都是来自github,可能会出现第三方库的维护问题,水平参差不齐问题等等。相较于Java,Go的生态缺少一些权威支持的第三方库,比如Java里面的apache,spring,等等现象级的框架。

支持更多平台和架构:
目前,Go语言已经支持多个平台和架构,包括Windows、Linux、macOS等。
在当下环境中,跨平台可以算是每一种编程语言的基本能力了,从Java的Write Once, Run anywhere. 甚至现在不仅仅包括三大主流系统:windows,mac,linux,还包含一些硬件嵌入式等系统的支持。

提供更好的工具和开发体验:
Go语言注重简洁、易用和高效的设计理念。未来,Go语言将继续改进工具链,提供更好的开发体验,包括更友好的IDE集成、更强大的调试工具等。
Go开发团队在最新的2年一次的开发者调查中,已经初步确定在24年中,将会把工具链和错误堆栈等作为将会解决的问题了。期待~
Go23年h2开发者调查报告-工具链错误

相较于Python的版本不兼容问题,比如Python2和Python3虽然大致上相同,但是仍然存在相当数量的SDK不兼容问题,比如最常用来举例的print "helloWorld"print("helloWorld")
SDK版本不兼容不仅仅只有Python,Scala也是其中之一,Scala2和Scala3就是不兼容的,比如spark发行物中,就有4种(也许现在不是了),spark2&&spark3,spark2,spark3,source code 。
SDK版本不兼容就会出现同样的代码逻辑需要开发两次,当然更多的是做适配,而不是核心逻辑也写两份,除此之外,还会出现同样的环境针对同一种语言需要依赖两种SDK,在开发的时候时候需要不断的切换SDK的版本。
幸运的是,目前为止,仅仅是目前为止,在Go的开发计划中,Go 2和Go 1 是高度兼容的,但是Go 的开发团队也没有做出完全保证,说Go 2和Go 1完全100%兼容。
Go 2计划

在这里插入图片描述

5. 要不要选择Go

语言只是一种工具而已,实现一个功能,只要不是特定领域的特定功能,我相信绝大部分编程语言都能实现。那么,为什么选择Go呢,看了看网上的资料,各有各的说法,不过确实有些说法很中肯。
比如Go语言背靠Google,其发展稳定性能得到一定的保障,不会出现烂尾的风险,当然现在也不能绝对。只是就目前来说,随着大环境的整体变差,降本增效是大主流,相比Java的大资源消耗,Go对于硬件资源的要求确实基本上做到了c/c++的程度,毕竟运行一个jvm就需要很大的资源。
有人认为Go是站在前人的肩膀上的一门语言,毕竟Go语言核心开发者,是c,c++,jvm,操作系统的作者或者参与者,重新设计一门全新的语言,那么一定会将之前成功的经验发扬光大,失败的问题提前避免。
比如相比c/c++,Go实现了自动内存回收,大大的解决了c/c++的内存管理难题。当然所谓的难题也只是对语言的深度不够导致的。
站在云原生和低资源消耗这两个角度,我认为学习Go有一定的必要,但还是看工作的需要和个人未来的发展规划。

没有哪一种语言是永恒的,但是其思想可以长存。 ~共勉

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

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

相关文章

构建基于RHEL7(CentOS7)的OpenSSH9.5p1的RPM包和升级回退方案

本文适用:RHEL7系列,或同类系统(CentOS7等) 文档形成时期:2023年 因软件世界之复杂和个人能力之限,难免疏漏和错误,欢迎指正。 文章目录 环境准备安装依赖openssh-9.5p1-el7.spec内容构建RPM包下载安装前注意事项开启t…

SQL注入攻击

1.用java实现登录的检查 package jdbc1;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Scanner;public class Login {public static void main(String args[]){try(Connection connec…

Redis管道操作

文章目录 1. 问题提出2. 解决方案3. 案例演示4. 总结 1. 问题提出 如何优化频繁命令往返造成的性能瓶颈? Redis是一种基于C/S一级请求响应协议的TCP服务,一个请求会遵循一下步骤: 客户端向服务端发送命令分四步(发送命令-> …

教程视频二维码怎么做?扫码学习使用技巧

现在购买商品时经常会发现使用手册或者包装上会印有相关的二维码,扫码可以查看产品介绍或者使用说明的视频教学。将需要展示的内容放到二维码中,让用户能够通过扫码了解内容详情,有效的降低成本而且方便用户获取内容。 那么如果想要制作视频…

中科星图——Landsat9_C2_SR大气校正后的地表反射率数据

数据名称: Landsat9_C2_SR 数据来源: USGS 时空范围: 2022年1月-2023年3月 空间范围: 全国 数据简介: Landsat9_C2_SR数据集是经大气校正后的地表反射率数据,属于Collection2的二级数据产品&#…

128基于matlab的粒子群优化算法寻找多元函数的最大值

基于matlab的粒子群优化算法寻找多元函数的最大值,可定义多元函数,变量区间范围,输出最大值条件下的变量值。程序已调通,可直接运行。 128matlab多元函数极值 (xiaohongshu.com)

Sectigo有几种泛域名SSL证书买一年送一个月

Sectigo是一家知名的数字证书颁发机构,提供了很多种类型的SSL证书,可以满足不同用户的需求。其中,泛域名SSL证书是一种常见的证书类型,可以同时保护主域名以及主域名下所有子域名。今天就随SSL盾小编了解Sectigo旗下有几种泛域名S…

【origin】负载牵引的Smith圆图

【origin】负载牵引的Smith圆图 1.从ADS导入数据到origin2.smith圆图3.扩展到多组线4.参考资料 1.从ADS导入数据到origin export导出为txt,得到的是幅相值,复制到excel如下图,有多根类似格式的线,只需要复制DE列到origin中 复制到…

腾讯云COS桶文件上传下载工具类

1&#xff0c;申请key和密钥 2&#xff0c;引入依赖 <dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.24</version></dependency>3&#xff0c;工具类 package com.example.activi…

怎么找微信服务器的IP地址

首先&#xff0c;让微信客户端在PC端运行&#xff0c;在任务管理器->详细信息中&#xff0c;找到WeChat.exe的进程&#xff0c;找到PID 就是微信进程的ID号&#xff0c;如下图所示&#xff1a; 打开一个命令行窗口&#xff0c;cmd或者powershell窗口都可以&#xff0c;输入…

筛选数据-第15届蓝桥第三次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第164讲。 第15届蓝桥杯第3次STEMA测评已于2023年12月17日落下帷幕&#xff0c;编程题一共有6题&#xff0c;分别如下&…

大数据之谷歌文件系统论文 GFS The Google File System

原文地址 谷歌文件系统论文 摘要 我们设计并实现了Google文件系统&#xff0c;这是一个面向大规模分布式数据密集型应用的可扩展分布式文件系统。 它在廉价的通用硬件上运行&#xff0c;提供了容错性&#xff0c;并向大量客户端提供高聚合性能。 尽管与先前的分布式文件系统…

2023 我的编程之旅——路人贾‘ω‘

哈喽&#xff01;大家好&#xff0c;我是路人贾&#x1f601;~今天不读论文也不讲算法&#xff0c;来聊点有意思的&#xff01; 这是我第100篇博文&#xff0c;我翻了几遍草稿箱的库存&#xff0c;正纠结选哪篇时&#xff0c;一抬头看见了这个活动&#xff0c;眼前瞬间一亮——…

高防服务器、高防 IP 和高防 CDN 之间有什么区别?

网络运营人员最头痛的是什么&#xff1f; 网络攻击无疑名列前茅。一旦企业遭受网络攻击&#xff0c;所面临的损失可能是无法估量的。那么&#xff0c;如何有效地抵御网络攻击呢&#xff1f; 高防 IP、高防 CDN 和高防服务器是当前主流的防御手段。那何为“高防”呢&#xff1…

【深度学习每日小知识】Overfitting 过拟合

过拟合是机器学习&#xff08;ML&#xff09;中的常见问题&#xff0c;是指模型过于复杂&#xff0c;泛化能力较差的场景。当模型在有限数量的数据上进行训练&#xff0c;并且学习了特定于该特定数据集的模式&#xff0c;而不是适用于新的、看不见的数据的一般模式时&#xff0…

tkinter控件中文显示为unicode编码的解决办法

一、背景 最近使用python tkinter编写界面应用时&#xff0c;发现按钮的中文名称在windows上显示正常&#xff0c;但是在linux上显示为中文的unicode编码&#xff1b;文本输入框也是&#xff0c;输入中文输时&#xff0c;text控件上也显示为unicode编码&#xff0c;如下图所示…

4.4 媒资管理模块 - 分布式任务处理介绍、视频处理技术方案

媒资管理模块 - 视频处理 文章目录 媒资管理模块 - 视频处理一、视频转码1.1 视频转码介绍1.2 FFmpeg 基本使用1.2.1 下载安装配置1.2.2 转码测试 1.3 工具类1.3.1 VideoUtil1.3.2 Mp4VideoUtil1.3.3 测试工具类 二、分布式任务处理2.1 分布式任务调度2.2 XXL-JOB 配置执行器 中…

智能雾化壁炉设计,新时代科技与美学的完美结合

智能雾化壁炉设计&#xff0c;新时代科技与美学的完美结合 随着科技的不断创新&#xff0c;智能雾化壁炉设计成为家居设计领域的一颗耀眼明珠。它的出现不仅改变了传统壁炉的概念&#xff0c;更为我们带来了全新的视觉和感官体验。下面让我们一起探索智能雾化壁炉设计的优势和特…

activiti流程图+动态表单

使用技术 jeecg-bootactivitivue3form-create 简单效果展示 流程图绘制 审批人配置 动态表单配置 流程审批 流程审批记录 填写表单信息 源码地址 后台&#xff1a;https://gitee.com/houshixin/jmg-boot前端&#xff1a;https://gitee.com/houshixin/jmg-ui

从技术走向管理

管理是可以通过后天的学习掌握的一项技能&#xff0c;但同时管理这条路每个人走的都不一样&#xff0c;因为没有一个固定的标准而且前面的路有很多未知和不确定性&#xff0c;所以不同的人对管理的理解、定义以及怎么做管理都会有不同的想法、做法。 很多一线的技术人员通常都…