1. Go语言优势和特点
1.1. 与Python对比
- Go部署简单,整个编译生成一个静态的可执行文件,除了glibc外没有其他依赖,一个进程文件,也比较好做监控和服务发现等;Python需要维护各种库、包依赖关系,部署的时候相当麻烦,不同版本的源不兼容问题会导致需要私建镜像
- Go并发性好,单个Go应用也能有效利用多个CPU核;Python的并发性是其本源劣势之一,脚本执行的全局所GIL导致Python的多线程无法有效利用多核,只能用多进程的方式,这样对进程的监控管理又有极大问题
- Go的源码,相比Python更容易理解,没有Python那般灵活的语法特性,无类型的特性,代码管理也是编译器级别就支持的,比Python更规范
1.2. 与C/C++对比
- Go的学习难度相比C/C++简单太多
- Go的原生库就支持几乎开发用到的所有必要组件,包括http、json、rpc等,开发难度很低
- Go原生语法级别支持的Goroutine使用协程,相比C/C++的线程,更容易使用,channel通信方式在多协程之间也是无锁的方式,相比C/C++的线程同步简单太多
- Go天然支持GC,无需程序员管理内存,无需关心内存是堆还是栈,解决了C/C++最容易出错的点,程序相比而言更容易稳定
- Go支持类型反射,使用Any类型(interface{})使得开发灵活性接近解析型语言
- Go天然支持pprof、trace等性能分析工具,极方便的解决性能瓶颈;C/C++得通过第三方性能分析工具+pdb来一一分析
1.3. 与Java对比
- Go在语言级别上,就支持高性能的http/tcp/udp的server,极容易编写的协程,极容易部署,天生适合后台服务
- 相比Java小巧轻量,占用内存小
- Go直接编译成机器码运行,而非Java利用虚拟机解释执行
2. Go的优势是如何实现的
2.1. 语法设计层面
- 关键字少,控制在几个核心关键字内,去除了C++里面一些不重要的关键字
- 语言设计层面强调并发编程,直接将协程作为语法层提供支持,go和channel
- 标准库囊括了业务开发的几个必要的组件,http、rpc、json、net等
- 编译器将代码的规范作为严格标准
2.2. rumtime
2.2.1. 协程调度机制
(1)线程模型:有哪些线程模型?各种系统下的实现?
Windows下实现的协程:https://keenjin.github.io/2019/08/win_coroutine/
(2)Go的线程模型:调度模型?
(3)各种模型的优势对比?Go的模型好处与坏处