Go 语言优势、对比

Go 语言优势、对比

1.用Go解决现在编程难题

a. 开发速度

使用更加智能的编译器,简化依赖的算法,提供更快的编译速度

1.Go只关注直接引用的库
2.JAVA 或 C++需要遍历依赖链中所有依赖的库

没有从编译到执行的中间过程,无法编写应用程序快速输出,但提供类型安全特性

1.动态语言需要使用大量的套件,测试类型错误的bug
2.静态语言提供类安全特性,自动捕获类型错误

2.并发

a. goroutine

go语言提供goroutine处理并发问题,goroutine很像线程,但代码更少,使用更少的内存
Gorouting 可以与其他goroutine并行执行函数,同时会与主程序(程序入口)并行执行

1.go语言会使用同一个线程执行多个goroutine
2.其他语言需要大量的代码来使用线程

b. 通道

一种特殊的数据结构,可以让goroutine之间进行安全的数据通信,可以避免其他语言里常见的共享内存的问题

1) 其他语言使用复杂的锁,避免不同的线程修改同一数据
2) go的通道模式保证同一时间只会有一个goroutine修改数据
3) 通道用于几个goroutine之间传输数据
4) 通道不提供跨goroutine的数据访问保护

a) 当通道传递的数据是副本的时候,各goroutine都会持有一份副本,各自对副本的修改是安全的
b) 当传递的是数据的指针时,如果读写是由不同的goroutine完成时,每个goroutine依旧需要格外的同步动作

3. 语言类型系统

简单无继承的类型系统,无需降低性能最大程度复用代码
使用组合设计模式,只需要简单的讲一个类型嵌入到另一个类型就能复用所有功能
独特的接口实现机制,允许对行为建模,而不是对类型建模

a. 类型简单

不仅仅支持int、string这样的内置类型,还支持用户自定义类型

b. 接口对一组行为建模

接口更小,之倾向于定义单一的动作
整个语言库使用了io.reader接口实现功能与网络的分离

4. 对比

a. 语言

静态语言

动态语言

b. python协程与go的goroutine对比:

I. 与线程的关系

1) python中协程是严格的1:N的关系,也就是一个线程对应多个携程,虽然实现了异步I/O但不能有效利用多核(GIL)

2) go中goroutine的关系是M:N的关系,N个goroutine会映射分配到M个线程上

a) 多个线程能分配到不同的核心上,CPU密集型的应用使用goroutine可以得到加速
b) 及时有少量的阻塞操作,也只会阻塞到某个worker线程,而不会阻塞整个程序

II: 对比

1) async是非抢占式的, 一旦使用async函数,整个程序必须都是用async的,不然总是会有阻塞的地方(一旦阻塞,对于没有实现异步特性的库,让调度器调度其他协程),也就是说async具有传染性
2) python的整个异步生态不太好,一旦使用异步,对于阻塞性的库就无法使用
3) goroutine的特性,是得所有库都可以直接使用
4) goroutine不需要显示使用await交出控制权,也不会严格使用时间片去调度goroutine,而是会在可能阻塞的地方插入调度,可以看作是版抢占式的

III: 异步

1) python的协程是eventloop模型
2) Erlang&golang都是采用CSP并发模型
3) erlang是基于进程的消息通信,golang是基于goroutine和channel的通信

IV: python和go都使用了消息调度系统模型,来避免锁的影响和进程/线程开销大的问题

1) 协程本质上来说是一种用户态的线程,不需要系统来执行抢占式调度,而是眼语言层面实现线程的调度
2) 协程不在使用共享内存/数据,而是通过通信共享内存/锁, 因为在一个超级大的系统里有无数的锁
3) 共享变量会使整个系统变得无比臃肿,通过消息机制来交流,是的每一个并发的单元都是一个独立的个体
4) 拥有自己的变量,单元之间变量不共享,对于单元的属于输出只有消息

参考:

知乎
Go语言程序设计

猜你喜欢

转载自blog.csdn.net/qq_40601372/article/details/101070715