GO开篇:手握Java走进Golang的世界

news2024/10/6 7:41:03

文章目录

  • 一、Golang简介
    • 1、Go的诞生
    • 2、Go的官网域名
    • 3、Go的发展
    • 4、Go的设计思想
    • 5、Go的特点
    • 6、Go的性能
    • 7、Go的吉祥物
  • 二、Go和Java的宏观对比
    • 1、编译型语言 or 解释型语言
    • 2、微观对比
  • 三、Go应用场景
    • 1、开源上的应用
  • 四、总结和后续

一、Golang简介

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种计算机高级编程语言。

Go的官方文档:https://golang.org

Go的中文api文档: https://studygolang.com/pkgdoc

Go中文社区网站: https://studygolang.com/

1、Go的诞生

在go退推出之前,已经存在很多高级编程语言了,比如:C、C++、C#、Java…。为什么还要再造一个GO呢?

主要原因有三个:

1> 计算机硬件技术更新频繁,性能提高很快。但是主流的编程语言发展明显落后于硬件,不能合理利用多核多CPU的优势提升软件系统性能。 旧的编程语言无法在开发效率与执行效率之间做出很好的平衡:

  • C++之类,执行效率高,开发效率低、编译速度慢。
  • JAVA之类,拥有高效的编译速度,但是执行效率低。

整体来看各个语言的执行效率和开发效率:

  • 执行效率(execution speed): C/C++ > Java > Python
  • 开发效率(developing efficiency): Python > Java > C/C++

Go语言的诞生一方面便是为了同时拥有高效的执行速度、编译速度和开发速度。

2> 软件系统复杂度越来越高,维护成本越来越高,缺乏一个足够简洁高效的编程语言。

  • 在Google公司内部,随着项目规模的不断扩大,开发和维护的复杂性也正在把Google公司一步一步拖入泥潭中。
  • 系统越来越复杂,大量的代码是由C++、Java、Python 写成,规模越来越庞大。需要大量的程序员每天都在围绕着数以万计行的代码、数百万的服务器工作着,以保证各项服务的正常运行。

3> 企业运行维护很多c/c++的项目,c/c++程序运行速度虽然很快,但是编译速度确很慢,同时还存在内存泄漏的一系列的困扰需要解决。

针对上述问题,谷歌公司的三位工程师于 2007 年 9 月 20 号下午进行一次讨论,正是这次讨论才有了第二天组织在位于加利福尼亚的山景城 43 号楼的三人会议。这与会的三人正是Go 的创始人:Robert Griesemer,Rob Pike 和 Ken Thompson。这三个神仙主要成就如下:

  1. Robert Griesemer罗伯特.格利茨默(Java HotSpot虚拟机、V8引擎开发者之一)
  2. Rob Pike罗伯.派克(贝尔实验室UNIX团队成员,曾参与Plan9、Inferno和Limbo等项目)
  3. Ken Thompson肯.汤普森(贝尔实验室UNIX团队成员,C语言、UNIX和Plan 9创始人之一,与Rob Pike共同开发了UTF-8字符集规范)

在Go的官网(https://go.dev/solutions/google/)上有Rob Pike的一段话,讲述了Go的诞生、发版、现状(2020年):

在这里插入图片描述

2、Go的官网域名

为什么官方叫Golang,而大家都在说它是Go呢?

有意思的是:Google 在注册 Go 的官网域名时,go.org域名已经被迪士尼注册。替而代之:golang.org域名才被使用。这也导致很多人误以为 Golang 是其正式名称;然而我们仅可以认为Golang是Go的一个绰号。

3、Go的发展

Go 语言起源于2007 年9月,2009年11月Google公司正式发布Go语言,并以BSD协议完全开源,2012年3月 go1.0发布,2015年8月go1.5版本发布(历史性的节点,完全移除C语言部分,使用GO编译GO)。当前最新的版本为go1.20。所有的发版节点(传送链接)如下:
在这里插入图片描述

此外,在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上;并且官方承诺,新版本对老版本下开发的代码完全兼容。

近2-3年GO语言在语言排行榜(https://www.tiobe.com/tiobe-index/)上的名次比较固定(第12位左右):
在这里插入图片描述

整体语言使用率趋势如下:

在这里插入图片描述

4、Go的设计思想

GO的核心设计很简单就是为了简单:“keep it simple”,其追求简单实用的哲学,从语言的层面上减少代码的复杂度。

比如:隐式接口&切片、类的弱化、指针的弱化、简洁高效的开发。

5、Go的特点

GO相对其他语法来说,最大的特点:并发。

其原生支持并发编程。Go 语言的对网络通信、并发和并行编程的支持度极高,从而可以更好地利用大量的分布式和多核的计算机。

开发者可以通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。

后续扩展GO的编程模型(GMP)。

不过GO也有很多面向对象语言的特性没有给以支持:

  • 不支持函数重载和操作符重载,为了简化设计;
  • 不支持隐式转换,为了避免在 C/C++ 开发中的一些 Bug 和混乱;
  • 放弃类和类型的继承,通过其他方式实现面向对象设计;
  • 不支持泛型;
  • 不支持动态加载代码、动态链接库;
  • 不支持动态代理;
  • 不支持静态变量;
  • 不支持断言;
  • 通过 recover 和 panic 来替代异常机制。

6、Go的性能

同C、C++一样,Go语言也是编译型的语言,它直接将人类可读的代码编译成了处理器可以直接运行的二进制文件,执行效率更高,性能更好。

根据 Go 开发团队和基本的算法测试,于 2013 年 3 月 28 日之前统计结果得出,Go 语言与 C 语言的性能差距大概在 10%~20% 之间。

保守估计在相同的环境和执行目标的情况下,Go 程序比 Java 或 Scala 应用程序要快上 2 倍,并比这两门语言使用少占用 70% 的内存。

7、Go的吉祥物

金花鼠(Gordon)

在这里插入图片描述

二、Go和Java的宏观对比

1> 跨平台?

  • Java因为有JVM虚拟机支撑的,故有“一次编译、处处运行”的特性。
  • 而GO没有虚拟机,不跨平台(多个操作系统),想要运行在多个平台,需要针对每个平台打不同的二进制程序包,编译成对应服务器操作系统版本的可执行程序,比如:windows的exe程序。
    • 我们说的go跨平台,指32位和64位相同操作系统之间的跨平台。

2> 代码风格?

  • Java语言编程风格很面向对象,提供了很多面向对象的特点,比如:重写、重载、继承、泛型、动态代理…
  • 而Go本着其设计原则**"keep it simple”**,更加简洁,可以用更少的代码实现同样的功能。

3> 并发性能(底层CPU的利用)?

  • GO1.5版本之前底层也和Java一样都是用C实现的。
  • JAVA诞生时(1995年),硬件层面还没有多核CPU的电脑,它对并发的支持是后来添加上去的。
  • 而GO诞生时(2009年),已经有了多核CPU的电脑,所以其在设计的时候充分利用了多核CPU,所以它对高并发的支持更好。

1、编译型语言 or 解释型语言

计算机编程语言按照运行方式可以分为:编译型语言、解释型语言。

  • 编译型:程序运行前先用编译器将程序源代码进行编译,以后拿着编译的结果直接运行。
  • 解释型:每次运行程序时,都需要拿到源代码,让解释器解释执行。

在这里插入图片描述

Go是一种编译型语言,运行在不同的平台需要打包成不同操作系统类型下的可执行文件。

Java既不是完全的编译型语言,也不是完全的解释型语言,它属于半编译、半解释型语言

  • 半编译:指它的代码都会编译成class类型的文件,并且只需要编译一次,就可以在不同的操作系统的Java虚拟机上执行;
  • 半解释:指在Java虚拟机中,它还是需要一句一句的将class文件的代码解释成对应操作系统可执行的代码。

2、微观对比

1> 引用类型参数传递

  • Go可以按值传递(以对象为参数)、也可以按引用传递(以对象指针为参数)。
  • Java只能是按引用传递

2> 面向对象特性

  • Go主打一个简单,没有切面编程、泛型、继承…
  • Java有很多面向对象的特性。

更多微观层面 Go 和 Java语言使用上的一些区别,见专栏的后续文章。

三、Go应用场景

编程语言只是一种工具,没有最好的,只有最合适的。

1、服务器编程。和Java一样,Go语言最多的应用场景就是服务器后端系统的开发,例如:微服务系统开发(Web应用、API应用)、处理日志、数据打包、虚拟机处理、文件系统等。

2、分布式系统开发。比如:集群系统、游戏服务器、数据库代理器、中间件等场景。

3、网络编程。Go非常适用需要高性能高并发的网络编程,用Socket相互传输数据的系统,类似于Java中Netty的用途。

4、云原生平台(运维管理系统)开发。目前国外很多云平台都采用Go开发,比如:Docker,K8s、以及很多DevOps平台。

5、游戏系统开发。

6、区块链开发。GO语言是区块链的第一开发语言。

Go语言不适合的场景为:

  • 强实时性软件,比如:语音通信、无人驾驶、垃圾回收、自动内存分配等。

1、开源上的应用

云原生技术中代表性的技术:docker、kubernetes、Prometheus、etcd、consul都是使用GO开发的。

笔者研究Go也正是为了看这几个技术的源码。

四、总结和后续

本文主要介绍了Golang的一些常识。

专栏将类比着Java介绍Go语言的使用,并以此展开对后续云原生开源技术的实践、源码阅读。

下一篇文章继续GO环境的搭建、Hello World代码的运行和运行原理。

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

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

相关文章

基于java+springboot+layui的流浪动物交流信息平台设计实现

基于javaspringbootlayui的流浪动物交流信息平台设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方…

ES6对象新增了哪些扩展?

一、属性的简写 ES6中,当对象键名与对应值名相等的时候,可以进行简写 const baz {foo:foo}// 等同于 const baz {foo} 方法也能够进行简写 const o {method() {return "Hello!";} };// 等同于const o {method: function() {return &qu…

时局不利,如何化解职场焦虑?

部分数据来源:ChatGPT 在不景气的经济环境下,大多数求职者都面临极大的压力,而技术人员又是其中之一。他们不仅需要不断学习新技能,还需要面对工作市场的竞争,并努力将自己的技能提升到所需的水平。一旦被拒绝或无法找…

半导体设计使用FTP外发文件存在风险,如何安全有效替代?

近几年,基于我国“科技强国”战略目标的实行,以半导体、人工智能、新能源等为代表的的科技型领域及行业快速发展。在半导体行业,以行业产业链来区分,整个行业包括上游材料和设备支撑、中游芯片设计和制造,以及下游移动…

用ArcGIS绘制研究区地图

科研tips:ArcGIS中国地图构建教程 有同学提问:怎么画论文最常用的研究区地图呢? 论文用图对准确性和美观度有一定要求,而ArcGIS具有强大的地图制作功能,可以利用该软件快速制作研究区地图。 01 地图的导入 &#…

C语言CRC-16 DNP格式校验函数

C语言CRC-16 DNP格式校验函数 CRC-16校验产生2个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-16校验算法实现,参考: C语言标准CRC-16校验函数。 不同应用规范通过对输…

基于 SpringBoot实现文档管理编辑器

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 本项目实现功能如下:注册、登录和个人资料修改;文档编辑:Markdown 文档的阅读和编辑、发布;文档管理; 使用 Cookies 保存登录状态;在数据库中使用 MD5 保…

【AUTOSAR】【以太网】SD

目录 一、概述 二、限制与约束 三、功能说明 3.1 需求 3.1.1 通用需求 3.1.2 以太网通信 3.1.3 状态处理 3.1.4 与SoAd的交互 3.1.5 订阅事件组重试处理 3.2 报文格式 3.2.1 Entries Array 3.2.2 Opotion Array 3.2.3 示例 3.3 服务发现条目 3.3.1 服务查找相关…

Godot引擎 4.0 文档 - 循序渐进教程 - 使用信号

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Using signals — Godot Engine (stable) documentation in English 使用信号 在本课中,我们将研究信号。它们是节点在发生特定事件时发出的消息&#xf…

S7-1200中通过MODBUS TCP客户端在一次请求中实现从服务器读写一个或多个保持性寄存器的具体方法

S7-1200中通过MODBUS TCP客户端在一次请求中实现从服务器读写一个或多个保持性寄存器的具体方法 TIA博途V17中增加了MODBUS TCP客户端功能码 23,可以在一次请求作业下实现从服务器读取和写入一个或多个保持性寄存器,这样省去了轮询的编程工作量,提高了工作效率,如下图所示,…

第三章 卷积神经网络

目录 一、CNN 基础二、CNN 进阶 卷积神经网络,Convolutinal Neural Network,CNN 在之前两章的由线性模型构成的神经网络都是全连接神经网络 一、CNN 基础 在之前全连接层处理二维图像的时候,直接将二维图像从 N 1 28 28 N \times 1 \t…

【DolphinScheduler 安装部署】DolphinScheduler调度系统如何安装部署?

要安装DolphinScheduler(以下简称DS)调度系统,请按照以下步骤进行操作: 系统要求: 确保您的计算机满足DS的最低系统要求,例如操作系统版本、内存和处理器要求等。DS通常在Linux系统上运行良好。 下载DS安装…

k8s部署mongodb副本高可用集群

此版本的NFS为单点,仅为练习使用,生产环境建议使用cephfs的卷类型,避免单点。或者通过keepalived加Sersync的方案对NFS作容灾处理即可用于生产环境。当然,对于开发或测试环境,方便起见,直接使用单点的NFS加…

Oracle OCP 和MySQL OCP 考试完成后查询成绩和下载证书的步骤

我的一些学员考完Oracle OCP和MySQL OCP不知道如何查看自己的考试成绩和证书,姚远老师现在详细说明具体的操作步骤,一共8步。 关于号主,姚远: Oracle ACE(Oracle和MySQL数据库方向)Oracle MAA 大师华为云…

基于Java+Springmvc+vue+element实现大学生科技创新创业项目管理系统

基于JavaSpringmvcvueelement实现大学生科技创新创业项目管理系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

【校园网设计】基于ensp的跨地区的校园网组网方案

本博客是基于模拟器ensp的校园网组网方案,有总校区和分校区,主要用了vlan划分、dhcp、nat、ospf、acl、bgp等技术。首先说一下本博客的局限性: 总校区和分校区之间只是使用的传统的bgp建立连接,这样可以在运营商上看到内网的明细&…

Squid 代理服务器的应用(传统代理、透明代理、ACL控制列表、sarg日志分析、反向代理)

一、Squid代理服务器的概述 squid 作为一款服务器代理工具,可以缓存网页对象,减少重复请求,从而达到加快网页访问速度,隐藏客户机真实IP,更为安全。 Squid主要提供缓存加速、应用层过滤控制的功能 1、squid代理的工…

Android Studio SDK无法勾选安装的解决方案

问题描述 1、在初次安装好Android Studio后,会启动AS,出现经典的Unable to access Android SDK add-on list报错,点Cancel即可。网上的解决方法分为两种:(1)设置Proxy为教育网(2)在…

Linux 下安装SonarQube (版本sonarqube7.6)

公司的虚拟环境坏了,sonarqube需要重新安装。简单记录安装过程和遇到的问题。 相关环境信息 CentOS Linux release 7.6.1810 (Core)MySQL 5.7.30sonarqube7.6JDK 11.0.2 一 安装Sonar前需要知道 1为什么要代码清洁 软件的核心是代码。代码不仅指导业务行为&#…

陈丹琦团队最新力作:上下文学习在上下文“学到”了什么?

深度学习自然语言处理 原创作者 | 鸽鸽 这段时间in-context learning真的很火,陈丹琦组最新的两篇文章都是ICL相关,今天我们拜读其中一篇:丹琦的硕士生、纽约大学准博士生Jane Pan的ACL小短文。 大佬的学生会做出怎样的科研示范呢&#xff1f…