Go语言认识

news2025/2/25 16:40:44

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.coloradmin.cn/o/1380145.html

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

相关文章

中国电子学会2020年6月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)

1.以下哪段程序可以实现小猫向左移动? A. B. C. D. 2.小猫给公园设计了如下的平面图,它想把黑色的路变成棕色,请问需要点击几次油漆桶按钮? A.3 B9 C.1 D.10 3.默认的小猫有两个造型(分别为造型1和造型2)。在运行下面的程序后,没有看到…

【信号与系统】【北京航空航天大学】实验一、信号的MATLAB表示及信号运算

一、实验目的 1、初步掌握 MATLAB 仿真软件的使用; 2、学习使用 MATLAB 产生基本时域信号,并绘制信号波形; 3、学习利用 MATLAB 实现信号的基本运算; 4、利用 MATLAB 分析常用的连续时域信号。 二、实验内容 1、 生成连续信号 …

什么是设备管理系统?设备管理系统解决方案有何优势?

随着企业规模的不断扩大以及设备功能增加以及复杂性,对设备的管理提出新的挑战。由此各设备管理系统随即涌入市场。设备管理系统是对设备的运行情况、维修情况等进行记录并快速维修,达到提高设备维修效率,优化设备生命周期的综合性解决方案系…

【idea】idea插件编写教程,博主原创idea插件 欢迎下载

前言:经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参, 例如日常开发中 我们使用Objects.equals去比较 status(入参),statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() ,再比…

Flask 小程序菜品搜索

mina/pages/food/index.wxml <!--index.wxml--> <!--1px 750/320 2.34rpx;--> <view class"container"><!--轮播图--><view class"swiper-container"><swiper class"swiper_box" autoplay"{{autoplay}…

品牌帮助中心:提升企业客户服务水平与效率的实用指南

什么是品牌帮助中心&#xff1f;简单来理解&#xff0c;他就是一种加速问题解决效率的方式&#xff0c;是通过在官网设置文章库或者社区的形式&#xff0c;为客户提供自助服务&#xff0c;自我查找问题答案。是一种既能提升问题解决效率&#xff0c;又能提升品牌形象的方式。接…

【LeetCode】203. 移除链表元素(简单)——代码随想录算法训练营Day03

题目链接&#xff1a;203. 移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff…

蓝牙音视频远程控制协议(AVRCP) AV/C command格式介绍

零.声明 本专栏文章我们会以连载的方式持续更新&#xff0c;本专栏计划更新内容如下&#xff1a; 第一篇:蓝牙综合介绍 &#xff0c;主要介绍蓝牙的一些概念&#xff0c;产生背景&#xff0c;发展轨迹&#xff0c;市面蓝牙介绍&#xff0c;以及蓝牙开发板介绍。 第二篇:Trans…

09-Python服务链路追踪案例

skyWalking Python agent requires SkyWalking 8.0 and Python 3.7 # 将django包导入 ~$ cd /apps ~$ tar xf django-test.tgz ~$ cd django-test# 安装模块 ~$ apt install python3-pip ~$ pip3 install -r requirements.txt# 创建django项目mysite ~$ django-admin startpro…

Vue:将以往的JQ页面,重构成Vue组件页面的大致思路梳理(组件化编码大致流程)

一、实现静态组件 组件要按照功能点拆分&#xff0c;命名不要与HTML元素冲突。 1、根据UI提供的原型图&#xff0c;进行结构拆分&#xff0c;拆分的粒度以是否方便给组件起名字为依据。并梳理好对应组件的层级依赖关系。 2、拆分好结构后&#xff0c;开始对应的写组件&#x…

案例118:基于微信小程序的电影院订票选座系统设计及实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

新型的变现和引流方式

AI 数字人短视频正成为一种新型的变现和引流方式。随着人工智能技术的不断发展&#xff0c;数字人技术也越来越成熟&#xff0c;为用户提供了更加逼真、生动的虚拟形象。通过AI 数字人短视频&#xff0c;用户可以创作出具有个性化特点的短视频内容&#xff0c;并将其发布在各大…

探索短链接:让网络分享更便捷

短链接是一种将长网址缩短为简洁形式的编码&#xff0c;它在互联网领域具有广泛的应用。本文将从多个方面介绍短链接的原理、类型、优势及应用场景&#xff0c;帮助您深入了解这一重要的网络技术。 短链接 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.…

数据结构之int类

int类 int 是数字类。在其他语言中&#xff0c;数字类有很明细的区分&#xff0c;如 int&#xff08;整型&#xff09;、unsigned int(无符号整型&#xff09;、short&#xff08;短整型&#xff09;、long&#xff08;长整型&#xff09;、longlong&#xff08;长长整型&…

AMEYA360:广和通RedCap模组FG131FG132系列

2024年1月&#xff0c;广和通RedCap模组FG131&FG132系列已进入工程送样阶段&#xff0c;可为终端客户提供样片。广和通RedCap模组系列满足不同终端对5G速率、功耗、尺寸、成本的需求&#xff0c;全面助力RedCap技术的行业应用。 FG131&FG132系列基于骁龙X35 5G调制解调…

apache、nginx、php 隐藏版本号

apache、nginx、php 隐藏版本号 针对的系统都是CentOS 1、没配置之前 1.1 Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.2.24 mod_wsgi/3.4 Python/2.7.5 1.2 Server: nginx/1.16.0 1.3 X-Powered-By&#xff1a;7.2.24 2、配置信息 不知道具体位置&#xff0c;可…

QT上位机开发(加密和解密)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 加密和解密是我们在软件开发中经常遇到的一种情形。最早的时候&#xff0c;加密是用在军事上面。现在由于各个行业、各个公司之间的竞争也非常激烈…

大模型开启应用时代 数钉科技一锤定音

叮叮叮叮&#xff01;数钉智造大模型&#xff0c;“定音”强势发布&#xff01; 随着科技的飞速发展&#xff0c;大模型技术已逐渐成为推动产业变革的核心力量。在这一浪潮中&#xff0c;数钉科技凭借深厚的技术积累和敏锐的市场洞察力&#xff0c;成功利用大模型技术搭建起智能…

银行接口测试学习笔记:接口测试从分析到设计!

一、接口测试流程 01\接口测试计划 制定:人员,工具/平台,脚本,时间,标准,输出接口测试计划文档 02\银行接口文档解析 ①.接口名称:说明接口的作用,不用测试 ②.接口地址:http开头,和URL一样,不用测试 ③.请求方式:post/get/delete/put, 当一个接口有多个方式的时候是需要进…

Leetcode202快乐数(java实现)

今天分享的题目是快乐数&#xff1a; 快乐数的定义如下&#xff1a; 快乐数&#xff08;Happy Number&#xff09;是指一个正整数&#xff0c;将其替换为各个位上数字的平方和&#xff0c;重复这个过程直到最后得到的结果为1&#xff0c;或者无限循环但不包含1。如果最终结果为…