返回顶部
首页 > 资讯 > 后端开发 > GO >GO开篇:手握Java走进Golang的世界
  • 777
分享到

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

golang 2023-08-18 22:08:07 777人浏览 泡泡鱼
摘要

文章目录 一、Golang简介1、Go的诞生2、Go的官网域名3、Go的发展4、Go的设计思想5、Go的特点6、Go的性能7、Go的吉祥物 二、Go和Java的宏观对比1、编译型语言 or 解释型语言2、微观对比 三、Go应

一、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应用场景

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

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

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

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

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

游戏系统开发。

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

Go语言不适合的场景为:

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

1、开源上的应用

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

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

四、总结和后续

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

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

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

来源地址:https://blog.csdn.net/Saintmm/article/details/130793052

您可能感兴趣的文档:

--结束END--

本文标题: GO开篇:手握Java走进Golang的世界

本文链接: https://www.lsjlt.com/news/374800.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何正确处理使用 Mux 的 Go 的可选查询参数?
    本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《如何正确处理使用 Mux 的 Go 的可选查询参数?》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~问题...
    99+
    2026-04-24
  • 如何在golang中格式化txt?
    知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《如何在golang中格式化txt?》,在实现功能的过程中也带大家重新温习相关知识点,温故而知...
    99+
    2026-04-24
  • 使用 golang 在 google admin sdk api 上获取 400 invalid_grant。有什么建议么?
    一分耕耘,一分收获!既然都打开这篇《使用 golang 在 google admin sdk api 上获取 400 invalid_grant。有什么建议么?》,就坚持看下去,学下去吧!本文主要会...
    99+
    2026-04-24
  • 我可以在应用程序引擎上部署 Golang 应用程序并在不修改代码的情况下读取/写入文件吗?
    在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《我可以在应用程序引擎上部署 Golang ...
    99+
    2026-04-24
  • Sqlx 连接具有相同字段的表
    对于一个Golang开发者来说,牢固扎实的基础是十分重要的,编程网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Sqlx 连接具有相同字段的表》,主要介绍了,希望对大家的知识积累有所帮助...
    99+
    2026-04-24
  • 如何从 go 中的另一个包访问结构变量?
    各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《如何从 go 中的另一个包访问结构变量?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很...
    99+
    2026-04-24
  • 使用 kafka-go 在 Kafka 中计划创建消费者
    编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天编程网就整理分享《使用 kafka-go 在 Ka...
    99+
    2026-04-24
  • 无法从 Golang 中的 Google userinfo API 响应访问电话号码(使用 golang.org/x/oauth2 和 Google People API)
    有志者,事竟成!如果你在学习Golang,那么本文《无法从 Golang 中的 Google userinfo API 响应访问电话号码(使用 golang.org/x/oauth2 和 Googl...
    99+
    2026-04-24
  • 如何使用 Gin-Gonic 在 Go 中读取蛇形 JSON 请求正文
    各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《如何使用 Gin-Gonic 在 Go 中读取蛇形 JSON 请求正文》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉...
    99+
    2026-04-24
  • 将带有指针值的interface{}类型传递给interface{}参数
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《将带有指针值的interface{}类型传递给interface{}参数》,就很适合你,本篇文章讲解的知识点主要包括。在...
    99+
    2026-04-24
  • 协会不处理测试条目
    今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《协会不处理测试条目》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起...
    99+
    2026-04-24
  • 如何UT上传文件
    珍惜时间,勤奋学习!今天给大家带来《如何UT上传文件》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学...
    99+
    2026-04-24
  • 为什么 go 程序将输出打印到终端屏幕而不是 /dev/stderr?
    各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《为什么 go 程序将输出打印到终端屏幕而不是 /dev/stderr?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉...
    99+
    2026-04-24
  • 如何在 GO 中将“_Ctype_int”更改为“int”?
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《如何在 GO 中将“_Ctype_int”更改为“int”?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中...
    99+
    2026-04-24
  • 为什么我的自定义错误类型会导致特定模式的错误?
    有志者,事竟成!如果你在学习Golang,那么本文《为什么我的自定义错误类型会导致特定模式的错误?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续...
    99+
    2026-04-24
  • 如何从空的 interface{} 类型访问 JSON 数据中的字段?
    大家好,我们又见面了啊~本文《如何从空的 interface{} 类型访问 JSON 数据中的字段?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Go...
    99+
    2026-04-24
  • 如何在Golang中为Azure SDK指定x509证书
    你在学习Golang相关的知识吗?本文《如何在Golang中为Azure SDK指定x509证书》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实...
    99+
    2026-04-24
  • etcd 事务中的原子计数器增量
    知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《etcd 事务中的原子计数器增量》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新...
    99+
    2026-04-24
  • 将字段添加到 MongoDB 内部对象
    知识点掌握了,还需要不断练习才能熟练运用。下面编程网给大家带来一个Golang开发实战,手把手教大家学习《将字段添加到 MongoDB 内部对象》,在实现功能的过程中也带大家重新温习相关知识点,温故...
    99+
    2026-04-24
  • 为什么 rows.Next() 取决于数据库响应率?
    亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《为什么 rows.Next() 取决于数据库响应率?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质...
    99+
    2026-04-24
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作