老Java学 Go 笔录(一) 到底为什么要学习 go ?

news2024/11/16 21:30:36

文章目录

  • 一.到底什么是go ?
    • 1.1 历史渊源
    • 1.2 优秀特性
    • 1.2 应用场景
    • 1.3 和 java 有什么不同
  • 二.聊一聊一个 java 的我为什么要学一学 go ?
    • 2.1 生活不止眼前苟且,还有诗和远方.但先要苟住
    • 2.2 了解一项新技能
  • 三.打算怎么去学
    • 3.1 官网大概搂一遍
    • 3.2 b 站的学习视频跟着走一回
    • 3.3 尝试在平时的代码中去用 go 来实现一次
    • 3.4 找个项目实际的去在业务里做实践
    • 3.5 有了一些积累了是不是可以去看看既有的框架是怎么写的
    • 3.6 系统的看看书里的介绍

前言

其实我是一个 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的改进。

  • 2022 年: Go 发布了 1.18 版本 ,新增了泛型的支持.

  • 2023 年: Go 发布了 1.21 版本 ,新增了builtin包中的minmaxclear支持.

  • 2024 年: Go 发布了 1.22 版本 做了 for 循环的增强支持.range关键字支持整型数据;新的高效的math/rand/v2

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

  • etcd 高性能分布式k-v 存储
    https://github.com/etcd-io/etcd

附:
go 中文网.https://hao.studygolang.com/
go 官网:http://docscn.studygolang.com/doc/
c语言中文网:https://c.biancheng.net/golang/

3.6 系统的看看书里的介绍

  • 《The Little Go Book》

  • 《The Way to Go》

  • 《Go Web 编程》

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

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

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

相关文章

经纬度聚类:聚类算法比较

需求: 将经纬度数据,根据经纬度进行聚类 初始数据 data.csv K均值聚类 简介 K均值(K-means)聚类是一种常用的无监督学习算法,用于将数据集中的样本分成K个不同的簇(cluster)。其基本思想是…

产品AB测试设计

因为vue2项目升级到vue3经历分享1,vue2项目升级到vue3经历分享2,前端系统升级,界面操作也发生改变,为了将影响降到最低,是不能轻易让所有用户使用新系统的。原系统使用好好的,如果新界面用户不喜欢&#xf…

C语言中字符串输入的3种方式

Ⅰ gets() 函数 gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间 # include <stdio.h> int main(void) {char a[256] {0};gets(a);printf("%s",a);return 0; }Ⅱ getchar() # include <stdio.h> int mai…

【实验】根据docker部署nginx并且实现https

环境准备 systemctl stop firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装最新版…

DSP实时分析平台设计方案:924-6U CPCI振动数据DSP实时分析平台

6U CPCI振动数据DSP实时分析平台 一、产品概述 基于CPCI结构完成40路AD输入&#xff0c;30路DA输出的信号处理平台&#xff0c;处理平台采用双DSPFPGA的结构&#xff0c;DSP采用TI公司新一代DSP TMS320C6678&#xff0c;FPGA采用Xilinx V5 5VLX110T-1FF1136芯片&#xff…

奇偶校验码

目录 前言 校验原理简介 奇偶校验码 前言 在前两个文章的学习中,我们已经知道了数字字符这些简单的数据应该怎么在计算机内部进行表示,其实本质上是0101的二进制代码,但是这些数据在计算机内部进行计算存取和传送的过程中,由于计算机原器件可能会发生故障,也有可能因为某些…

Qt服务器端与客户端交互

Qt做客户端与服务器端交互第一步引入network 第一步引入network后继续编程首先界面设计 创建server和socket 引入QTcpServer&#xff0c;QTcpSocket MainWindow.h代码如下 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer&…

STM32入门学习之ADC

1.ADC在STM32进行数据采集时十分重要。通过ADC可以将外界的数字信号转换为模拟信号&#xff0c;以满足采样的需求。(资料参考于正点原子) STM32 拥有 1~3 个 ADC &#xff08; STM32F101/102 系列只有 1 个 ADC &#xff09;&#xff0c;这些 ADC 可以独立使用&#…

《老相册》读后感

外面在下着瓢泼大雨&#xff0c;豆粒大的雨点打在窗户上&#xff0c;发出啪啪的巨响。这样的雨天&#xff0c;是不适宜外出的&#xff0c;最惬意的方式就是一个人待在宿舍里&#xff0c;打开一本书&#xff0c;慢慢地看&#xff0c;静静地想&#xff0c;让所有的烦恼融化在这雨…

数据结构学习/复习7--栈的实现/括号匹配练习题/队列的实现/队列实现栈练习

一、栈 1.概念及性质 2.栈的实现(top0版) 注意事项&#xff1a;top也可初始为-1,代码需要调整 二、栈练习 1.括号匹配 三、队列 1.概念及性质 2、队列的实现 四、队列练习 1.两个队列实现栈

从零开始学AI绘画,万字Stable Diffusion终极教程(四)

【第4期】图生图 欢迎来到SD的终极教程&#xff0c;这是我们的第四节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在前面的课程中&#xff0c;我…

动手写一个简单的Android 表格控件支持固定列

Android 动手写一个简洁版表格控件 简介 源码已放到 Github Gitee 作为在测绘地理信息行业中穿梭的打工人&#xff0c;遇到各种数据采集需求&#xff0c;既然有数据采集需求&#xff0c;那当然少不了数据展示功能&#xff0c;最常见的如表格方式展示。 当然&#xff0c;类似…

论文辅助笔记:TimeLLM

1 __init__ 2 forward 3 FlattenHead 4 ReprogrammingLayer

Go 语言基础(一)【基本用法】

前言 最近心情格外不舒畅&#xff0c;不仅仅是对前途的迷茫&#xff0c;这种迷茫倒是我自己的问题还好&#xff0c;关键它是我们这种普通吗喽抗衡不了的。 那就换个脑子&#xff0c;学点新东西吧&#xff0c;比如 Go&#xff1f; 1、Go 语言入门 介绍就没必要多说了&#xff0…

vue快速入门(五十四)$nextTick的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 $nextTick的使用场景演示 源码 App.vue <template><div id"app"><h3>{{name}}</h3><button click"showfixed">修改</button><form action"post" v-s…

Git常用(持续更新)

常用场景&#xff1a; 初始化&#xff1a; git config --global user.name "codelabs" git config --global user.email mycodelabs.com git init git remote add origin https://github.com/username/repository.git git pull origin master 提交&#xff1a; gi…

设计模式: 责任链模式

目录 一&#xff0c;责任链模式 二&#xff0c;特点 四&#xff0c;实现步骤 五&#xff0c;代码 一&#xff0c;责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种软件设计模式&#xff0c;它属于行为型模式。在这种模式中&#xff0c…

2024五一赛数学建模A题B题C题完整思路+数据代码+参考论文

A题 钢板最优切割路径问题 &#xff08;完整资料在文末获取&#xff09; 1. 建立坐标系和表示方法&#xff1a; 在建模之前&#xff0c;我们需要将切割布局转换为数学表示。首先&#xff0c;我们可以将布局中的每个点表示为二维坐标系中的一个点。例如&#xff0c;B1可以表示…

【吊打面试官系列】Java高并发篇 - Thread 类中的 yield 方法有什么作用?

大家好&#xff0c;我是锋哥。今天分享关于 【Thread 类中的 yield 方法有什么作用&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Thread 类中的 yield 方法有什么作用&#xff1f; 使当前线程从执行状态&#xff08;运行状态&#xff09;变为可执行态&#x…

【数据结构(邓俊辉)学习笔记】列表04——排序器

文章目录 0. 统一入口1. 选择排序1.1 构思1.2 实例1.3 实现1.4 复杂度 2. 插入排序2.1 构思2.2 实例2.3 实现2.4 复杂度分析2.5 性能分析 3. 归并排序3.1 二路归并算法3.1.1 二路归并算法原理3.1.2 二路归并算法实现3.1.3 归并时间 3.2 分治策略3.2.1 实现3.2.2 排序时间 4. 总…