这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
作为一个之前基本都是用java开发的大三学生,我第一次接触到golang是在几个月前,当时跟着MIT的教授学习6.824,分布式系统的实现,其中的实验都是用golang来实现的,因此就简单看了一眼golang,这次是第二次重温golang,因此今天从一个java开发者的角度来聊聊golang
1.语法特点
说实话,第一次看到golang的时候,我第一反应是:? 这不是c语言+python吗 好熟悉的感觉 但是感觉和java一点都不像。golang的语法十分简洁,之前了解的时候有看到说,golang就是几个创始人在用cpp开发的时候感觉十分的繁琐,因此就想开发一种简洁的语言,golang具备着python一般的简洁,舍弃了许多不必要的东西,如基础数据结构只有map,slice,channel以及不是很常用的数组,再例如循环只使用了for,舍弃了while等等,总的来说,作为一门较新的语言,它汲取了老前辈们很多优点,也总结改正了许多缺点,总的来说,在开发便捷程度上提升了很多,也被许多大厂所青睐
2.协程
提到golang,一个不得不说的概念就是协程,golang最大的特点之一便是协程,协程是一种比线程更轻量级的存在,一个线程内的多个协程的运行是串行的。如果有多核CPU的话,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内的多个协程却绝对串行的,无论有多少个CPU(核),它可以理解为是一种特殊的函数,在golang中,只需要在函数调用时,在前面加上一个 go 关键字,即可开一个新的协程调用它,类似于java中的new thread(()->xxx).start(),众所周知,线程最大的开支来自于其上下文的切换,但协程不同,它有着自己的上下文,因此,协程之间切换开销极小,一直处于用户态中,它所占用的内存也极小,一个程序开个几千个协程轻轻松松
3.启动速度及内存开销
而另一个概念,便是最近十分热门的云原生,golang似乎天生便是为了云原生而诞生的语言,java的内存占用一直是令人诟病的问题,而作为java的几乎霸权的开发框架,spring的启动速度也一直被人指摘,多次向官方提议(当然,在springboot3.0中解决了这一问题,但大部分开发者仍停留在2.X阶段),而golang完美的解决了这两点。背靠着谷歌这座大山,它自带的SDK十分丰富且稳定,启动时间基本都能控制在秒这个单位上,同时,协程的开销远小于线程,1000个线程可能要占用到将近2G的内存,而golang可以开个上万个协程都轻轻松松,显著降低了内存的占用,线上OOM的风险大大减小