【go】程序启动时发生了什么?为什么选择go语言开发,优势劣势
go程序运行主要发生了什么?
可以分三个阶段回答:
操作系统
的处理阶段,runtime运行时
处理阶段,用户代码
执行阶段
操作系统
处理阶段:- 加载
可执行文件
到内存 - 设置
堆栈
- 加载
环境变量
- 创建
线程
- 加载
runtime运行时
处理阶段:初始协程
栈,大小2kb,动态扩容划分内存
区域(arena、bitmap、spans)- 启动
GC
GMP调度器初始化
用户代码
:- 针对导入的包,进一步深入到调用的
最底层
,
执行该包的init()
,然后跳回
上一层,执行init,
直到回到主函数的init执行后,执行main - 如果main里有
新的协程
创建,那么交由GMP调度器管理
- 程序退出时,执行所有
defer
函数,然后退出
- 针对导入的包,进一步深入到调用的
为什么学go?优势,劣势?
- 为什么学?语法简单清晰,执行高效。
- go优势:
- 通过goroutine协程和channl管道,支持原生高并发
- 接近C语言的性能,但是语法更简单
- 开发效率高,相对于java历史遗留问题没那么多,毕竟是新时代后端开发语言
- Docker,k8s,普罗米修斯都是go写的,云原生生态好
- go劣势:
- 错误处理比较冗长,有很多重复代码
- 相较于java比较年轻,生态库没有java丰富
- GC垃圾回收在极高性能要求场景有延迟问题
https://github.com/0voice