Go和Java的区别

74 阅读2分钟

1.性能上: golang的性能比Java更好,占用内存更少,使用goroutine避免内核态和用户态切换成本。

2.编译部署:Java通过虚拟机编译,使用JVM跨平台编译;Go中不存在虚拟机,针对不同的平台,编译对应的机器码;

3.访问权限: java使用public、protected、private、默认等关键字;golang通过大小写控制。

4.接口: java等面向对象编程的接口是侵入式接口,需要明确声明自己实现了某个接口。 而Golang的非侵入式接口不需要通过任何关键字,只要一个类型实现了接口的所有方法,就是这个接口的实现。

5.异常处理:java中错误(Error)和异常(Exception)被分类管理,golang中只有error,一旦发生错误逐层返回,直到被处理。

6.继承:Java的继承通过extends关键字完成,不支持多继承;Go语言的继承通过Struct的方式,子类只需要把基类作为成员放在子类的定义中,支持多继承。

7.多态:java的多态,必须满足继承,重写,向上转型;在Go语言中通过接口实现多态,对接口的实现只需要某个类型T实现了接口中的方法,就相当于实现了该接口。

8.值传递和引用传递:java中不存在显式的指针,而Golang中存在显式的指针操作。java和golang都是只存在值传递。

9.并发:在Java中,通常借助于共享内存(全局变量)作为线程间通信的媒介,通常会有线程不安全问题,使用了加锁(同步化)、使用原子类、使用volatile提升可见性等解决;但在Golang中使用的是通道(channel)作为协程间通信的媒介,多个goroutine之间通过Channel来通信,chan的读取和写入操作为原子操作,所以是安全的。

10.垃圾回收和内存管理机制:Java基于JVM虚拟机的分代收集算法完成GC,golang内存释放语言层面,对不再使用的内存资源进行自动回收,多级缓存,非分代,并发的三色标记算法。