golang与java

@lucas  July 26, 2023

1、golang是编译型语言,由go编译器直接将源码编译成二进制机器码,接着可以直接再操作系统上运行;

2、java是半编译半解释型语言,首先将源码编译成虚拟机字节码,再由Java 虚拟机(JVM)解释字节码运行。

3、Java 是面向对象语言,而 Go 不完全是
面向对象的三大特性:封装、继承和多态。

Go 没有继承的概念,认为组合优于继承。不过,在 Go 中,可以通过内嵌来模仿部分类似继承的功能,但本质还是组合。

此外,Go 只在接口层面有多态,没有方法重载。

4、Java 不少特性是基于 Annotation 的,Go 没有 Annotation
许多 Java 库(特别是框架,比如Spring),都充分利用了 Java 的注解(Annotation)。注解提供元数据(通常在运行时使用),以修改库提供的行为。Go 没有注解,因此缺少此功能。Go 可以使用代码生成(go generate)获得与注释类似的结果。Go 有一种简单的注解形式,称为 tag,可用于自定义某些库行为,如 JSON 或 XML 格式。

5、Go 和 Java 都使用 GC 管理内存
这两门语言都使用 stack 和 heap 来保存数据。栈主要用于函数局部变量,堆用于其他动态创建的数据。在 Java 中,所有对象都在堆上分配。在 Go 中,堆上只分配可在函数生命周期之外使用的数据(通过逃逸分析确认)。在 Java 和 Go 中,堆都是垃圾收集的;堆对象由代码显式分配,但总是由垃圾收集器回收。

Java 没有指向对象的指针的概念,只引用位于堆中的对象。Go 允许访问指向任何数据值的指针(或地址)。在大多数情况下,Go 的指针可以像 Java 引用一样使用。

Go 的垃圾收集实现比 Java 的更简单,通常 Go GC 需要调优的情况较少(没有太多选项可配置)。

6、Go 和 Java 都支持并发,但方式不同
Java 有线程(Thread)的概念。而 Go 是 Goroutine,它是由语言提供的。Goroutine 通常被称为轻量级线程。Go 运行时支持使用比 JRE 支持的线程多得多的 Goroutine。

Java 支持同步控制。Go 具有类似的库函数。Go 和 Java 都支持跨 Thread/Goroutine 安全更新的原子值的概念。两者都支持显式锁定库。

Go 提供了通信顺序进程(CSP)的概念,作为 Goroutine 在没有显式同步和锁定的情况下进行交互的主要方式。Goroutine 通过 channel 进行通信,channel 是有效的管道(FIFO 队列),通常与 select 语句相结合使用。


添加新评论