掘金 后端 ( ) • 2024-05-05 16:58

前言

其实我是一个 Java 程序员,至少目前我是搞 Java 的,靠这个营生养活家庭的中年有点秃的南方人. 从接触计算机开始经历了 VB , c# ,c (现在早已交还给老师).再到现在吃饭的 Java ,也掌握的一般般. 开这个专栏主要是以 Java 语言基础这样一个身份去尝试学习 go 语言.希望有一些不一样的思考,也欢迎大家一起交流讨论.

一.到底什么是go ?

1.1 历史渊源

源于一则小故事.摘自知乎.

说起 Go 语言的诞生,不得不说一件趣事。 事件起源于2007年,当时 C++委员会正在 Google 对 C++ 语言新增加的35个新的特性进行一场分享演讲。 Google 的技术大神们也在认真听讲座,罗布也是其中一位。随着会议的中场休息,大家开始了对这些 C++ 语言新特性是否带来更多的价进行热烈的讨论。 说是讨论,倒不如说是吐槽更好,他们一致认为:与其在臃肿的语言上不断增加新的特性,不如简化编程语言。 于是,灵光一现,为什么我们自己不做一门新的语言解决这个问题呢?脑袋一拍之后,Go 语言这门新秀就应运而生。

总结一下就是大佬们觉得原来的语言太过繁杂,不如自己搞一个吧.还是感叹大佬就是大佬以及开放的技术环境.

大概的版本历程.详见:官方 https://go.dev/doc/devel/release

  • 2007年:谷歌公司的Robert GriesemerRob PikeKen Thompson开始设计和开发Go语言项目。

  • 2009年:Go语言首次公开亮相,并在同年11月正式发布了Go 1.0版本。

  • 2010年:Go语言的编译器从C语言实现转变为Go语言实现,并加入了对ARM处理器的支持。

  • 2012年:Go语言发布了Go 1.1版本,增加了对Windows系统的支持,并引入了对Go语言包的API变更的兼容性保证。

  • 2013年:Go语言发布了Go 1.2版本,增加了对并发编程的支持,并引入了goroutine和channel等特性。

  • 2014年:Go语言发布了Go 1.3版本,改进了垃圾回收器的性能,并增加了对标准库的更新和改进。

  • 2015年:Go语言发布了Go 1.4版本,引入了对ARM64处理器的支持,并改进了编译器性能和垃圾回收器的稳定性。

  • 2016年:Go语言发布了Go 1.6版本,引入了对TLS1.3HTTP/2的支持,并改进了编译器和运行时的性能。

基本是这两个版本再次让 Go 重新走入了人们的视野.解决了一直诟病的 gc 效率问题.

  • 2017年:Go语言发布了Go 1.8版本,引入了对上下文的支持,并改进了垃圾回收器的性能和稳定性。

  • 2018年:Go语言发布了Go 1.10版本,改进了编译器和运行时的性能,并引入了对WebAssembly的实验性支持。

  • 2019年:Go语言发布了Go 1.12版本,引入了对模块化的支持,并改进了编译器和运行时的性能。

  • 2020年:Go语言发布了Go 1.15版本,改进了编译器和运行时的性能,并引入了对嵌入式系统的支持。

  • 2021年:Go语言发布了Go 1.17版本,改进了编译器和运行时的性能,并引入了对Go语言包管理工具go mod的改进。

Go语言的发展历史中,不断改进性能和稳定性,并引入新的特性和功能,使其逐渐成为一门越来越受欢迎的编程语言。

1.2 优秀特性

并发编程:Go语言在设计之初就考虑了并发编程的需求。它引入了轻量级的goroutinechannel机制,使得并发编程变得简单而高效。这对于处理大规模并发的网络应用、并行计算和分布式系统非常重要。

高效性能:Go语言的编译器和运行时系统被优化为产生高效的机器代码,使得Go程序具有出色的执行性能。Go语言还专注于内存管理和垃圾回收,以提供可预测的性能和低延迟的响应。

简单易用:Go语言的语法设计简洁清晰,学习曲线相对较低。它摒弃了一些复杂的特性和细节,使得代码更易于编写、阅读和维护。Go语言还提供了丰富的标准库和工具,方便开发者进行日常的编程任务。秉承了开发 go 语言大佬的一贯原则,less is more. 更少的语言声明,简单的语法,即使是一个小白开发也有不错的开发效果.

跨平台支持:Go语言的编译器和运行时系统支持多种操作系统和处理器架构,包括WindowsLinuxmacOSAndroid等。这使得开发者可以轻松地编写跨平台的应用程序,减少了开发和维护的难度。

开源社区支持:Go语言是一个开源项目,拥有庞大的开发者社区。这个社区积极参与Go语言的发展和改进,并提供了丰富的开源库和工具,方便开发者快速构建应用程序。当然相比 java 目前还是相对来说没那么多社区支持,毕竟 java 都那么多年了.这也正是一个比较好的机会.

总结一下就是 兼具 python 的易用性保证生产力以及 c 的高性能.并且占用资源极小.如果你想利用更少的资源去做更多的高并发支持,那么 go 绝对是一个不二之选.

1.2 应用场景

网络编程:Go语言的并发模型和轻量级的goroutine机制使其非常适合处理高并发的网络应用。许多网络服务和框架,如Web服务器、API服务、微等,都选择使用Go语言来构建,以获得高性能和可扩展性。

分布式系统:Go语言的并发特性和网络编程能力使其成为构建分布式系统的理想选择。例如,容器编排工具Docker和容器编排平台Kubernetes的核心组件就是用Go语言开发的。Go语言还提供了丰富的标准库和第三方库,方便开发者构建分布式系统的各个组件。

数据库和存储系统:Go语言可以与各种数据库和存储系统进行无缝集成。许多流行的数据库和缓存系统,如MySQLPostgreSQLRedis等,都提供了Go语言的客户端库。Go语言还有自己的数据库,如BoltDBCockroachDB,可用于构建嵌入式数据库和分布式数据库。

云计算和大数据:Go语言的高性能和并发能力使其成为处理大规模数据和并行计算的理想语言。许云计算和大数据相关的工具和框架,如Apache KafkaApache BeamApache Arrow等,都提供了Go语言的支持。

系统工具和命令行应用:Go语言的静态链接特性使得生成独立可执行文件非常方便,使其成为构建系统工具和命令行应用的理想选择。许多知名的开源工具和命令行应用,如DockerGitInfluxDB等,都使用Go语言来实现核心功能。

1.3 和 java 有什么不同

语言特性:Go语言注重简洁性和可读性,语法设计相对简单,去除了一些复杂的特性和细节。而Java语言注重面向对象编程,拥有更完整的面向对象特性,如类、继承、多态等。Go语言引入了轻量级的goroutinechannel机制,使得并发编程更加简单和高效。

并发编程:Go语言在设计之初就考虑了并发编程的需求,通过goroutinechannel提供了简洁而高效的并发模型。而Java语言在并发编程方面使用线程和锁机制,需要开发者自行处理锁的问题。相比之下,Go语言的并发编程更加简单和安全,避免了 谈高并发就头痛的问题.

性能:Go语言的编译器和运行时系统被优化为产生高效的机器代码,具有出色的执行性能。而Java语言的性能相对较好,但由于运行在Java虚拟机上,需要额外的解释和执行过程,可能会造成一些性能损失。

生态系统和库支持:Java语言拥有庞大而成熟的生态系统和丰富的第三方库,可以满足各种应用需求。而Go语言的生态系统相对较新,但也在快速发展,拥有越来越多的优秀库和工具。

跨平台支持:Java语言的“一次编写,到处运行”的特性使其具有较好的跨平台支持,可以在不同操作系统上运行。而Go语言的编译器和运行时系统也提供了广泛的跨平台支持,可以在多种操作系统和处理器架构上运行。

二.聊一聊一个 java 的我为什么要学一学 go ?

2.1 生活不止眼前苟且,还有诗和远方.但先要苟住

先来看看生活的苟且吧[狗头].从目前勾子招聘网站看了眼的.由于本身目前是在做后端的应用开发.目前关注主要还是后端这边的企业级开发语言支持.像前端,app,硬件等就不在此列去讨论了.

先看目前后端里称霸多年的 爪哇 (java),

在这里插入图片描述 虽说是经济不景气,还是不耽误 java 这位老大哥的招聘需求还是非常不错.

对比之下看下目前前端时间都比较火的 鸿蒙 不得不说还是差一些.至少从招聘岗位上来说. 在这里插入图片描述

再看一眼目前后端使用最多的 python ,得益于丰富的类库以及 AIGC 盛起.从招聘的岗位来说还是差一些,这也是比较意外的. 在这里插入图片描述

再看一下今天咱们要聊的 go .从这个数量来说比不上 老大哥 java ,对比其他的岗位机会基本是碾压的形势.

在这里插入图片描述

再从https://hellogithub.com/report/tiobe?month=1 TIOBE 看了看今年以来的趋势.从 1 月份到现在 4 月份的整体 go 的形势还是有所增长.虽然幅度不高.

再看一看具体的岗位吧.

  • 作业帮
从这个要求的技能上来看,基本的一些后端技能库.这个基本是属于一个业务开发的一个岗位,虽然是业务开发.那不得不说对于二三线的公司来说算得上一个不错的薪资了.
  • 宇宙条

从岗位描述上看属于一个 AI 的岗位,也是目前比较火🔥🔥🔥爆的岗位,要求也是比较高.薪资也是非常的诱人.属于天花板级别的开发岗了.

  • 新浪微博 属于一个老牌的老厂子了.出道比较早.属于最早做门户网站起家的.现在估计名声在外属于微博这块了.也是属于一个业务开发的岗位.整体上要求不算太高.薪资也非常可以了.

自己的体会

平常也有和一些大厂的同学沟通,结合自己和猎头的交流.再说一下切身的一些体会.目前国内的 top 的一些大厂都逐渐增加了 go 在自己业务系统,底层基础系统的一些角色占比.比如:腾讯,字节,阿里,京东.都有涉及.其中字节,腾讯了解下来占比比较多.阿里,京东目前主流还是 java .一些中间件会用 go 来进行开发.美团目前没有听说有 go 的岗位.一些二线的比如说 b站,知乎甚至从整个主站的维度都用 go 做了重构.

总体上从岗位诉求维度来说,个人觉得整体是向上的趋势.而且目前整个的供给侧还没有 java 这样比较多的竞争.所以如果说你有一些充足的时间也想去了解新的语言,给自己增加一个被资本家剥削的技能.那么 go 是一个个人觉得比较好的选择.

2.2 了解一项新技能

这一节纯粹是基于技术的热情,或者说仅有一些技术热情.之前在耗子叔的一个专栏听到这样的一些建议.(原文可能不是这样.)

一个和合格的程序员应该张掌握几门语言.一方面可以语言之间有所比较,引发一些编程和开发的思考.另外一点可以以此作为学习能力的训练,对于程序员来说学习能力持续是必不可少的.

有感如此,当时就在想,我也是这样想的.我不是英雄.但是真的略微同哈.另外还有一点,在学习过程觉得可以通过这样与现有知识的结合,进一步的缝补知识网,更能深刻理解.对于深入了长时间的 java 来说,大部分都是在接触业务的开发,很有必要去进一步的了解一些底层的内容.如果你没有特意去了解,那么 go 将是一个不错的机会.介入 cjava 之间的权衡的设计会是一个好的学习机会.

三.打算怎么去学

3.1 官网大概搂一遍

不知道谁说过学习一门语言最好的就是他的开发手册.这里也并不例外.先搂一遍,知不知道先混个脸熟.盲人摸象也不一定是一件坏事.在这个阶段就是这样.

https://go.dev/dl/

3.2 b 站的学习视频跟着走一回

相信有了 java 的基础这些基本的代码敲一次不是什么问题

3.3 尝试在平时的代码中去用 go 来实现一次

如果你在公司里有这样的机会那么恭喜你,有地方去做尝试了.有同学说了公司里都是 java .怎么办.有一个比较不错的法子不定期去刷刷力扣吧.用两种语言去试试.以考带练.

3.4 找个项目实际的去在业务里做实践

3.5 有了一些积累了是不是可以去看看既有的框架是怎么写的

熟读唐诗三百首,不回作诗也会吟诗.作为一个程序员持续去学习阅读源码是不可少的一门技能和功课.不求能达成大佬,至少也要看看大佬是如何设计和实践的,感谢大佬,感谢开源吧.

  • beego 高性能 web 框架

https://github.com/astaxie/beego

附: go 中文网.https://hao.studygolang.com/ go 官网:http://docscn.studygolang.com/doc/

赠人玫瑰 手有余香 我是柏修 一名持续更新的晚熟程序员 期待您的点赞,关注加收藏,加个关注不迷路,感谢 您的鼓励是我更新的最大动力 ↓↓↓↓↓↓