这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
(内容根据字节跳动青训营课程内容以及自己的理解编写)
近期将日更这几个主题的文章,欢迎关注!
- 几种数据类型详解
- 全面理解go协程
- channel通信
- Kitex
- Hertx
- Gorm
go的优势
首先我们要清楚,我们为什么要学习一门语言,它能干啥?适用于什么开发?相比其他的语言有哪些优点?
以下是青训营给出的答案:
1.高性能,就拿协程举个例子
大家都知道线程和进程,在操作系统这门课中会学到,进程太大了,切换损耗大,所以有了线程。协程也可以这么理解,如下图:
线程是MB级别的,属于内核态,协程是KB级别的,是用户态。
(内核态可以看做是你的领导,用户态是你。比如你要审批文件,你需要去找领导签字,这个时候需要切换内核态。比如你要敲一行代码,你就是用户态就行。用户态不需要切换内核态的消耗。)
所以go可以主动启动协程,不需要系统去“审核”(切换成内核态),而且可以轻松启动上万个协程(KB级别)
这么一看是不是好厉害。
2. 语法简单
比如启动一个web服务:
几行就搞定
3.和4. 库多和工具链
github等社区许多开源库,后面的文章会写到
5. 静态编译
这个的意思简而言之就是,build之后不需要依赖别的库了。
这里我一开始也没不怎么清楚,直到看了这一篇文章:传送门
编译之后可以直接跨平台运行,不需要依赖其他东西
c语言的:
go语言的:
但是size大一些:
(有时候也会动态编译,因为是基于Cgo编译的(C+go哈哈哈),C语言有很多性能优秀的数据库,也可以手动关闭,这会导致编译出来的文件大一些,关闭的方式就是在编译的时候加上参数,上面一个文章里有)
6.快速编译
这个也厉害,Java开发者都知道,JVM本地一跑起来就是十几秒,并且占用很大的内存。
而go语言,课程介绍,编译只需1s,整个抖音的上线代码编译也只有一分钟,这个是真的厉害!
7.跨平台
详细见第五点,就是不需要依赖其他东西就可以跑起来
这一点的话,就拿docker来说,你不需要多一层JVM了,省下了很多docker内存!
(动辄大几百MB的java容器很吃内存...)
8.垃圾回收
当前Golang使用的垃圾回收机制是三色标记法配合写屏障和辅助GC,三色标记法是标记-清除法的一种增强版本。
总结
我之前用的是java开发,go语言相比来说确实有不少优点,解决了我在java开发中的一些问题
引用参考
1.编译机制
2.GC机制