背景
随着越来越多大厂使用Golang(后面简称Go)语言,很多人不断从Java阵营转向Go阵地,到底它的魅力在哪里?和Java它有哪些优势?适合在哪些场景下使用?希望接下来的分享能从中找到答案
Go在Tiobe排行
2022年3月
- Go最好成绩在2017年排名第10
- 七牛云创始人兼CTO许式伟曾说过Go语言会取代Java
Go的来历
很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的分布式集群,大牛觉得很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一个人,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。
于是乎,Rob Pike和其他几个大牛讨论了一下,怎么解决这个问题,过了一会,Rob Pike说要不我们自己搞个语言吧,名字叫“go”,非常简短,容易拼写。其他几位大牛就说好啊,然后他们找了块白板,在上面写下希望能有哪些功能(详见文尾)。接下来的时间里,大牛们开心的讨论设计这门语言的特性,经过漫长的岁月,他们决定,以c语言为原型,以及借鉴其他语言的一些特性,来解放程序员,解放自己,然后在2009年,go语言诞生。
总结:c++语言在处理繁琐的核心工作上无法高效完成。以C为原型,借鉴其他语言的一些特性自研Go语言,来解放程序员,解放自己。
Go思想
Less can be more 大道至简
Go应运而生
- 出身名门:Google
- 官网:https://golang.google.cn/
- 诞生于2006年1月2日下午15点4分5秒,于2009年11月开源,2012年发布go稳定版。
- 最新版本1.182022.03.15
- 语言优势
- 为并发而生,单机性能高
- 协程实现
- 协程在用户态处理,不会像线程一样切换需要内核态进行处理
- 协程以用户线程为宿主,单个协程4kb,可轻松支持百万协程
- 协程概念 https://zhuanlan.zhihu.com/p/169426477
- 协程实现
- 简单易学,开发效率高
- 运行速度接近C,并发性能接近Nginx,编码效率接近PHP(https://blog.csdn.net/ronon77/article/details/84716629)
- 被称为“互联网时代的C语言”
- 为并发而生,单机性能高
var a int = 0
for i := 0; i < 20; i++ {
fmt.Println("hello",i)
}
- 主要特性
- 1.自动垃圾回收
-
go 1.3 之前使用标记清除
-
go 1.5 三色标记法
-
go 1.8 三色标记法 + 混合写屏障机制
-
三色标记
- 主要流程:
- 首先将对象用三种颜色表示,分别是白色、灰色和黑色。最开始所有对象都是白色的,然后把其中全局变量和函数栈里的对象置为灰色。
- 第二步把灰色的对象全部置为黑色,然后把原先灰色对象指向的变量都置为灰色,以此类推。
- 等发现没有对象可以被置为灰色时,所有的白色变量就一定是需要被清理的垃圾了。通过write-barrier(写屏障)检测对象变化
- https://www.cnblogs.com/hezhixiong/p/9577199.html
- https://blog.csdn.net/zhghost/article/details/104120759
- https://segmentfault.com/a/1190000012597428
- https://www.cnblogs.com/peteremperor/p/13692129.html
-
- 2.并发编程
-
goroutine虚拟线程(协程又叫轻量级用户线程),用户态处理。单个goroutine 4kb左右,可以很轻松创建数百万个。启动比线程快,一个关键字go启动协程
-
一个Go程需要4k
内存4k * 80,000 = 320,000k ≈ 0.3G
内存4k * 1,000,000 = 4,000,000k ≈ 4G
内存(注意4k这是需要连续地址的内存块)
据我所知,在32位处理器上,Go程的数量上限就是80000左右
但是在64位处理器上,基本不受限制,在我的机器上8G,可以创建100万Go程。
https://www.zhihu.com/question/48507569
-
-
GMP 模型(v1.5)
-
M:machine的缩写,一个M代表一个内核线程,或者称之为“工作线程”
-
P:processor的缩写。一个P代表执行一个GO代码片段所必须的资源(或称之为“上下文环境”),即用户级线程
-
G:goroutine的缩写(即协程)。一个G代表一个GO代码片段。前者是对后者的一种封装。
-
go func () 调度流程
-
调度器生命周期
- Go 调度本质是把大量的 goroutine 分配到少量线程上去执行,并利用多核并行,实现更强大的并发
- Go 调度本质是把大量的 goroutine 分配到少量线程上去执行,并利用多核并行,实现更强大的并发
-
-
搭配 channel通道。goroutine 奉行通过通信来共享内存,而不是共享内存来通信。
-
参考资料
https://blog.csdn.net/qq_15054345/article/details/89964800?utm_source=app&app_version=5.3.0&code=app_1562916241&uLinkId=usr1mkqgl919blen
https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/GMP%E5%8E%9F%E7%90%86%E4%B8%8E%E8%B0%83%E5%BA%A6.html
-
- 3.更丰富的内置类型
值类型:
- 1.自动垃圾回收
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128 --复数
array -- 数组
引用类型:(指针类型)
slice -- 可变的数组(最常用) , 也叫切片
map -- 映射
chan -- 管道
https://studygolang.com/articles/18255
https://www.topgoer.com/go%E5%9F%BA%E7%A1%80/%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B.html
- 4.函数多返回值
func getTeacher()(name string ,age int ,address string) {
name = "仓老师"
age = 18
address = "东京市"
return
}
https://www.cnblogs.com/tobeymarshall/p/11950854.html
- 5.错误处理
func Sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.New("math: square root of negative number")
}
}
- 6.反射
- 7.匿名函数和闭包
- 8.类型和接口
- 9.语言交互性
- 可以和C混合使用
- 适合做什么?
- 服务端开发
- 分布式系统,微服务
- 网络编程
- 区块链开发
- 内存KV数据库,例如boltDB、levelDB
- 云平台
目前在用公司
- Google 创造Go,k8s,docker
- Facebook 开源 https://github.com/facebookgo
- 七牛云 国内第一家用Go(2011年),存储服务端主体语言
- 字节 飞书,社交
- 百度 前端流量接入,百度消息通讯
- 腾讯(k8s持续集成)
- 京东 消息推送,云存储
- 360 日志搜索系统 https://github.com/Qihoo360/poseidon
- 阿里
- 滴滴
- 美团
- 小米
- 新浪
- …
和Java对比
对比\语言 | java | go |
---|---|---|
适合领域 | 非常广,企业级分布式应用平台/大数据/安卓/GUI等… | 消息推送、监控、容器、爬虫和网络高并发场景等… |
入门难度 | 适中 | 简单 |
运行速度 | 快 | 快 |
占用内存 | 大 | 小 |
语法简洁 | 适中 | 极简 |
实现高并发难易 | 一般 | 容易 |
分布式场景方案 | 完善 | 基本完善 |
版本迭代速度 | 6个月左右 | 6个月左右 |
垃圾回收 | 有 | 有 |
从业人数 | 极多 | 较少 |
网上资料 | 满天飞 | 适中 |
总结
- Go语言语法的简洁能高效的工作
- Go语言生态发展很快
- Go在高并发和基础设施方向应用广泛
- Go和Java相比有优势也有不足,目前看各大厂对Go未来很看好
最后
你认为Go未来会取代Java吗?