> For the complete documentation index, see [llms.txt](https://gitbook.fantasticmao.cn/tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gitbook.fantasticmao.cn/tech/go/go-vs-c-vsjava.md).

# Go vs C vsJava

## 指针

Go 有指针，但不支持多级指针。

C 有指针，并且支持多级指针。

Java 没有指针。

## 垃圾回收

Go 和 Java 带有垃圾回收，C 是没有的。

## switch case 语句

Go 的 switch-case 语句默认自带 break，C 和 Java 是没有的。

## if 语句

Go 的 if 语句和 for 语句一样，可以声明一个只在 if / for 语句作用域之内的变量，C 和 Java 不支持。

## 多值返回

Go 支持函数返回多个参数，C 和 Java 不支持。

## 变量声明

Go 的变量声明语法是：名称 + 类型，C 和 Java 是：类型 + 名称。

## 包管理

Go 使用官方的 Go Modules 包管理工具，除了一些库依赖 GitHub，其它都挺好用的。

C/C++ 使用 Make、CMake ...... 包管理工具，由于历史包袱太重，C 的各种库使用各种不同的包管理工具，相比于 Go 和 Java 来说比较难用。

Java 使用 Maven 和 Gradle 包管理工具，还有个中央 Maven 仓库，使用体验很好。

## 实现接口

Go 中采用隐式实现接口的方式，一个类型只要实现了某个接口的所有方法，则就是实现了该接口，不需要使用也没有 `implements` 关键字。

C 中没有接口的概念。

Java 中需要显示声明实现接口，需要使用 `implements` 关键字。

## 数据结构

| 语言 \ 数据结构 | array | slice / list | set | map |
| --------- | ----- | ------------ | --- | --- |
| Go        | ✅     | ✅            | ❌   | ✅   |
| C         | ✅     | ❌            | ❌   | ❌   |
| Java      | ✅     | ✅            | ✅   | ✅   |
