目录
0 介绍
1.1 源文件与组织
C
Go
Python
Java(传统)
Java 25+ Compact Source(定稿)
01 程序结构与入口
1.2 入口函数规则
1.3 编译与运行流程
1.4 语句与块
1.5 注释
1.6 易混点
02 变量常量作用域
2.1 声明 vs 定义 vs 赋值
2.2 可变性
2.3 作用域规则
2.4 零值 / 默认值
2.5 类型推断对照
2.6 易混点
03 数据类型
3.1 类型系统哲学
3.2 整数类型
3.3 浮点
3.4 布尔
3.5 字符与字符串类型
3.6 复合类型总览
3.7 类型转换规则
3.8 空值表示
3.9 易混点
04 运算符与表达式
4.1 算术运算符
4.2 比较与逻辑
4.3 位运算
4.4 赋值与复合赋值
4.5 地址、解引用、成员访问
4.6 运算符优先级(记忆版)
4.7 类型相关运算符/表达式
4.8 易混点
05 控制流
5.1 条件分支 if
5.2 switch
5.3 循环
5.4 跳转语句
5.5 模式匹配(2026 水平)
5.6 异常与控制流(交叉)
5.7 易混点
06 函数与方法
6.1 函数定义语法
6.2 参数传递语义
6.3 多返回值 / 可选返回
6.4 默认参数 / 重载 / 可变参数
6.5 闭包与高阶函数
6.6 方法与接收者
6.7 递归、内联、尾调用
6.8 易混点
07 字符串与字符
7.1 内部表示
7.2 字面量形式
7.3 常用操作对照
7.4 转义与 Unicode
7.5 C 字符串特别说明
7.6 Go 字符串与 rune
7.7 易混点
08 集合与复合结构
8.1 数组 / 定长序列
8.2 动态序列
8.3 映射(键值对)
8.4 结构体 / 记录
8.5 集合类型扩展
8.6 迭代
8.7 内存布局(C/Go 重点)
8.8 易混点
09 指针引用内存
9.1 有无指针
9.2 指针基础(C / Go)
9.3 内存分配与释放
9.4 栈 vs 堆
9.5 垃圾回收
9.6 常见内存问题
9.7 引用语义对比
9.8 unsafe / 底层操作
9.9 易混点
10 输入输出
10.1 标准流模型
10.2 控制台输出
10.3 控制台输入
10.4 文件 I/O
Python 推荐
Go 推荐
Java 推荐
10.5 二进制 I/O
10.6 缓冲 I/O
10.7 序列化(JSON 等)
10.8 易混点
11 错误与异常
11.1 对照
11.2 C:返回码与 errno
11.3 Go:error 接口
11.4 Python:异常
11.5 Java:受检与非受检
11.6 四语言错误处理对照表
11.7 资源管理与错误
11.8 选型直觉
11.9 易混点
12 面向对象与组合
12.1 范式定位
12.2 类 / 结构体定义
12.3 继承 vs 组合
Go 嵌入(组合)
Python 继承
Java
12.4 接口 / 抽象
12.5 多态
12.6 访问控制
12.7 特殊 OOP 特性
12.8 Java record 与 Python dataclass
12.9 易混点
13 泛型与类型参数
13.1 支持概览
13.2 C:宏与 _Generic
13.3 Go 泛型
13.4 Python 类型参数
13.5 Java 泛型
13.6 约束 / 边界对照
13.7 协变与逆变(进阶)
13.8 易混点
14 并发模型
14.1 总览
14.2 C:POSIX 线程
14.3 Go:goroutine 与 channel
14.4 Python:GIL、asyncio、多进程
threading(I/O 密集)
asyncio(协作式并发)
Python 3.14 自由线程(可选构建)
14.5 Java:平台线程与虚拟线程
传统线程
虚拟线程(Java 21+,生产可用)
Java 25 定稿:Scoped Values
Java 26 预览:Structured Concurrency
14.6 同步原语对照
14.7 并发选型建议
14.8 易混点
15 模块包依赖
15.1 组织单元对照
15.2 C:头文件与链接
15.3 Go:module
15.4 Python:包与 pyproject
15.5 Java:包、模块系统、构建
传统包
Java 9+ 模块(module-info.java)
Java 25:Module Import Declarations(定稿)
15.6 版本与发布
15.7 可见性总结
15.8 易混点
16 标准库速览与学习路径
16.1 标准库哲学
16.2 按领域对照
字符串与文本
容器与算法
I/O 与文件
时间与随机
加密与安全
测试
并发
16.3 C23 新增库要点
16.4 Python 3.14 值得知道的标准库
16.5 Java 25/26 值得知道的标准库
16.6 Go 1.26/1.27 标准库动态
16.7 推荐学习路径(交叉强化)
阶段 1:共性基础(2–3 周)
阶段 2:数据结构(3–4 周)
阶段 3:抽象与工程(4–6 周)
阶段 4:系统能力(按兴趣)
阶段 5:2026 新特性补课
16.8 工具链速查
0 介绍
|
语言 |
学习基线 |
说明 |
|
Go |
1.26(2026-02) |
1.27(预计 2026-08)引入泛型方法,本文以 1.26 稳定语法为主,并标注 1.27 前瞻 |
|
C |
C23(ISO/IEC 9899:2024) |
GCC 15+ 默认 gnu23;下一代 C2y 仍在草案阶段,仅作备注 |
|
Python |
3.14.x(3.14.6,2026-06) |
含 t-string、延迟注解求值、自由线程官方支持等 |
|
Java |
25 LTS + 26 特性了解 |
生产优先学 25 LTS;26(2026-03)为非 LTS,文中标注预览特性 |
各语言语法更新
Go 1.26
- new(expr):可对表达式分配并初始化,返回指针(如 p := new(42) → *int)
- 泛型类型可在自身类型参数列表中自引用(更强约束表达)
- Green Tea GC 默认开启;go fix 现代化重写
Go 1.27(前瞻)
- 泛型方法(method 可声明自己的类型参数)
- encoding/json/v2 等标准库大改
C23
- 关键字:bool / true / false、nullptr、constexpr、typeof / typeof_unqual、alignas / alignof、thread_local、static_assert
- 字面量:二进制 0b、数字分隔符 1'000'000、空初始化 ={}
- 预处理:#embed、#elifdef / #elifndef、#warning
- 类型:_BitInt(N)、可选十进制浮点 _Decimal*
- 属性:[[nodiscard]]、[[deprecated]]、[[fallthrough]] 等
- 新头文件:<stdbit.h>、<stdckdint.h>
Python 3.14
- t-string(PEP 750):t"…" → Template,用于安全的自定义字符串处理
- 注解延迟求值(PEP 649/749)
- except / except* 可省略括号(PEP 758)
- 禁止从 finally 中 return/break/continue 跳出(PEP 765)
- Free-threaded Python 官方支持(PEP 779,可选构建)
- compression.zstd、多解释器 stdlib 支持
Java 25 LTS(定稿重点)
- Compact Source Files + Instance Main Methods(简化入门)
- Module Import Declarations(import module …)
- Flexible Constructor Bodies
- Scoped Values(定稿)
- 虚线程(Java 21 已定稿,25 继续强化生态)
Java 26(了解)
- 原语类型进入 pattern / instanceof / switch(第 4 次预览)
- Structured Concurrency(第 6 次预览)
- HTTP/3 for HttpClient
- Lazy Constants(第 2 次预览)
|
语言 |
定位 |
典型场景 |
|
C |
贴近硬件的系统级过程式语言 |
OS、嵌入式、驱动、高性能库、语言运行时 |
|
Go |
带 GC 的静态类型、偏后端并发的工程语言 |
云原生、微服务、CLI、网络代理 |
|
Python |
动态类型、表达力优先的通用脚本/应用语言 |
数据/AI、自动化、Web、胶水代码 |
|
Java |
强静态类型、JVM 生态的企业级面向对象语言 |
后端服务、Android(Kotlin 为主)、大数据中间件 |
|
章节文件 |
覆盖维度 |
|
01程序结构与入口 |
源文件组织、main、包/模块、编译运行 |
|
02变量常量作用域 |
声明、可变性、作用域、零值/默认值 |
|
03数据类型 |
标量、复合、类型系统哲学 |
|
04运算符与表达式 |
算术/逻辑/位运算、优先级差异 |
|
05控制流 |
if/switch/循环/模式匹配 |
|
06函数与方法 |
定义、参数传递、多返回值、闭包 |
|
07字符串与字符 |
编码、字面量、常用操作 |
|
08集合与复合结构 |
数组/切片/列表/Map/结构体 |
|
09指针引用内存 |
指针、引用、GC、所有权直觉 |
|
10输入输出 |
控制台、文件、格式化 IO |
|
11错误与异常 |
error 值 vs 异常 vs errno |
|
12面向对象与组合 |
class/interface/struct+方法 |
|
13泛型与类型参数 |
泛型语法与约束 |
|
14并发模型 |
线程/协程/CSP/虚线程 |
|
15模块包依赖 |
依赖管理与可见性 |
|
16标准库速览与学习路径 |
常用库对照 + 建议学法 |
1.1 源文件与组织
|
维度 |
C |
Go |
Python |
Java |
|
源文件后缀 |
.c + .h |
.go |
.py |
.java |
|
编译单元 |
每个 .c 独立编译,链接合并 |
以 package 为单位 |
以 模块/文件 为单位,解释执行 |
以 class 为单位,编译为 .class/JAR |
|
头文件/声明分离 |
.h 声明 + .c 实现 |
无头文件,同包内可见 |
无头文件 |
无头文件,靠 import |
|
命名空间 |
无(靠前缀/静态) |
package 名 |
模块 __name__ |
package 声明 |
C
// main.c
#include <stdio.h>
int main(void) { puts("hello"); return 0; }
Go
package main
import "fmt"
func main() { fmt.Println("hello") }
Python
def main():
print("hello")
if __name__ == "__main__":
main()
Java(传统)
public class App {
public static void main(String[] args) {
System.out.println("hello");
}
}
Java 25+ Compact Source(定稿)
// 无 class 包裹,实例 main
void main() {
IO.println("hello");
}
01 程序结构与入口
1.2 入口函数规则
|
语言 |
入口 |
返回值 |
参数 |
|
C |
main |
int(0 成功) |
argc, argv 或 void |
|
Go |
main(必须在 package main) |
无返回值 |
无参数 |
|
Python |
无强制入口;惯例 if __name__ == "__main__" |
— |
sys.argv 可选 |
|
Java |
public static void main(String[] args) |
void |
String[] args |
|
Java 25 |
还可用实例 void main() |
void |
可简化 |
差异要点
- 只有 C 和 Java(传统) 把 main 签名写进语言规范。
- Go 的 main 不能带参数,命令行用 os.Args。
- Python 脚本可直接顶层执行,入口是约定而非语法强制。
1.3 编译与运行流程
C: 源码 → 预处理 → 编译(.o) → 链接 → 可执行文件
Go: 源码 → 编译(静态链接)→ 可执行文件
Python:源码 → 字节码(.pyc) → 解释器执行
Java: 源码 → 字节码(.class) → JVM 解释/JIT
|
语言 |
典型命令 |
产物 |
|
C |
gcc -std=c23 main.c -o app |
原生二进制 |
|
Go |
go build / go run |
原生二进制 |
|
Python |
python3 script.py |
无独立二进制(可用 PyInstaller 打包) |
|
Java |
javac App.java && java App |
JVM 字节码 |
1.4 语句与块
|
特性 |
C |
Go |
Python |
Java |
|
语句结束 |
; 必须 |
无 ;(可选) |
换行/冒号块 |
; 必须 |
|
代码块 |
{ } |
{ } |
缩进 |
{ } |
|
单行多语句 |
支持 |
支持 |
用 ; |
支持 |
Python 独特点:用缩进(通常 4 空格)表达块,这是语法的一部分,不是风格问题。
1.5 注释
|
类型 |
C |
Go |
Python |
Java |
|
单行 |
// |
// |
# |
// |
|
多行 |
/* */ |
/* */ |
""" """ 或 ''' ''' |
/* */ |
|
文档注释 |
— |
— |
模块/函数 docstring |
/** */ Javadoc |
1.6 易混点
02 变量常量作用域
2.1 声明 vs 定义 vs 赋值
|
语言 |
声明语法 |
必须先声明? |
未初始化行为 |
|
C |
int x; / int x = 1; |
是(C23 支持 auto 推断) |
局部变量未定义值(危险) |
|
Go |
var x int / x := 1 |
是 |
包级/局部有零值 |
|
Python |
x = 1(赋值即绑定) |
否 |
未赋值就使用 → NameError |
|
Java |
int x; / int x = 1; |
是 |
局部变量必须显式赋值后才可用 |
示例对照
// C23
auto count = 42; // 类型推断
constexpr int MAX = 100; // 编译期常量对象
var a int // 0
b := 3.14 // 短变量声明,类型推断
const Pi = 3.14 // 编译期常量
x = 10 # 动态绑定,类型可随时变
x = "hello" # 合法
MAX: int = 100 # 类型注解 + 赋值(运行时检查,非强制)
final int MAX = 100;
var list = List.of(1, 2); // 局部变量类型推断(Java 10+)
2.2 可变性
|
概念 |
C |
Go |
Python |
Java |
|
常量 |
const / constexpr |
const |
无真正常量关键字;惯例 MAX = 1 大写 |
final |
|
只读指针 |
const int *p |
无 const 指针 |
— |
final 引用 |
|
深不可变 |
靠约定 |
靠约定 |
tuple、frozenset |
record 字段默认可设 final |
Go 注意:const 只能是编译期可求值的常量表达式;没有 const 修饰变量引用。
Python 注意:tuple 不可变指的是引用不可重新绑定元素(若元素是可变对象,内容仍可改)。
2.3 作用域规则
|
作用域 |
C |
Go |
Python |
Java |
|
块级 |
✅ { } 内 |
✅ |
✅(函数内赋值产生局部变量) |
✅ |
|
函数级 |
✅ |
✅ |
✅ |
✅ |
|
文件/包级 |
static/全局 |
包级 var |
模块全局 |
类字段 / 包 |
|
闭包捕获 |
无闭包 |
捕获外部变量 |
nonlocal/global |
匿名类/lambda 捕获 effectively final |
Python 的 LEGB 规则
Local → Enclosing → Global → Built-in
x = 1
def f():
global x # 修改模块级 x
x = 2
Go 的短声明陷阱
if x := compute(); x > 0 { } // x 仅 if 块内
2.4 零值 / 默认值
|
类型 |
C(未初始化局部) |
Go 零值 |
Python |
Java 默认值 |
|
整数 |
垃圾值 |
0 |
— |
0 |
|
浮点 |
垃圾值 |
0 |
— |
0 |
|
布尔 |
垃圾值 |
FALSE |
FALSE |
FALSE |
|
指针/引用 |
垃圾值 |
nil |
None |
null |
|
字符串 |
垃圾值 |
"" |
— |
null(对象引用) |
关键差异:只有 Go 和 Java(字段) 系统性提供零值;C 局部变量 不初始化是经典 bug 源。
2.5 类型推断对照
|
语言 |
机制 |
示例 |
|
C23 |
auto(对象定义) |
auto x = 1; |
|
C23 |
typeof / typeof_unqual |
typeof(x) y = 0; |
|
Go |
:=、泛型推断 |
n := 1 |
|
Python |
动态,无需声明 |
x = [1,2] |
|
Java |
var(局部,Java 10+) |
var m = Map.of() |
2.6 易混点
03 数据类型
3.1 类型系统哲学
|
语言 |
分类 |
检查时机 |
核心特征 |
|
C |
静态、弱 |
编译期 |
贴近机器,隐式转换多 |
|
Go |
静态、强 |
编译期 |
简洁,无隐式数值窄化 |
|
Python |
动态、强 |
运行时 |
一切皆对象 |
|
Java |
静态、强 |
编译期 |
原始类型 + 包装类双轨 |
3.2 整数类型
|
语言 |
常见类型 |
任意精度 |
|
C |
char, short, int, long, long long + stdint.h 定宽类型 |
无(C23 _BitInt(N) 可指定位宽) |
|
Go |
int, int8(8bit位也就是1byte)…int64, uint, uintptr |
无 |
|
Python |
单一 int(任意精度) |
✅ 内置 |
|
Java |
byte, short, int, long |
BigInteger |
#include <stdint.h>
int32_t a = 1;
_BitInt(128) big; // C23
var n int = 42 // int 大小随平台(32或64位)
int x = 1;
long y = 1L;
3.3 浮点
|
语言 |
类型 |
备注 |
|
C |
float, double, long double;C23 可选 _Decimal32/64/128 |
IEEE 754 |
|
Go |
float32, float64 |
无 float 别名 |
|
Python |
float(双精度) |
还有 decimal.Decimal 模块 |
|
Java |
float, double |
BigDecimal 精确十进制 |
3.4 布尔
|
语言 |
类型 |
与整数关系 |
|
C23 |
bool(关键字) |
不能与整数隐式混用 |
|
C(旧) |
_Bool / <stdbool.h> |
历史上有 0/1 习惯 |
|
Go |
bool |
独立类型 |
|
Python |
bool 是 int 子类 |
True == 1 为真 |
|
Java |
boolean |
完全独立 |
3.5 字符与字符串类型
|
语言 |
字符 |
字符串 |
|
C |
char, wchar_t, char8_t(C23), char16_t, char32_t |
char* / 数组,不以 \\0 结尾会出问题 |
|
Go |
byte(uint8 别名), rune(int32,码点) |
string 不可变 UTF-8 |
|
Python |
无独立 char;str 是 Unicode 码点序列 |
str 不可变 |
|
Java |
char(UTF-16 代码单元) |
String 不可变 |
3.6 复合类型总览
|
概念 |
C |
Go |
Python |
Java |
|
固定数组 |
int a[10] |
[10]int |
list 可模拟 |
int[] |
|
动态序列 |
手动 malloc |
slice []int |
list |
ArrayList 等 |
|
关联映射 |
无内置 |
map[K]V |
dict |
HashMap 等 |
|
结构体 |
struct |
struct |
无;用 class/dataclass |
class / record |
|
枚举 |
enum(C23 增强) |
const + iota / 自定义 |
Enum 类 |
enum |
|
联合体 |
union |
无 |
无 |
无 |
|
指针 |
int *p |
*int |
无用户可见指针 |
无指针(只有引用) |
3.7 类型转换规则
|
语言 |
隐式转换 |
显式转换 |
|
C |
大量(整数提升、算术转换) |
(int)x 强制转换 |
|
Go |
极少(如 untyped constant) |
int(x), strconv |
|
Python |
不强调“转换”,运行时多态 |
int(), str() 等构造 |
|
Java |
小范围拓宽(widening) |
强制 (int)x,装箱拆箱 |
记忆:C 最“松”,Go/Java 最“严”,Python 不靠编译期转换而靠对象协议。
3.8 空值表示
|
语言 |
空值 |
类型安全 |
|
C |
NULL / C23 nullptr |
C23 nullptr_t 更安全 |
|
Go |
nil(指针、slice、map、chan、func、interface) |
有 |
|
Python |
None |
有 |
|
Java |
null |
有;Optional 可表达“可能无值” |
3.9 易混点
04 运算符与表达式
4.1 算术运算符
|
运算符 |
C |
Go |
Python |
Java |
|
+ – * / |
✅ |
✅ |
✅ |
✅ |
|
整数除法 |
截断向零 |
截断向零 |
// 整除,/ 真除 |
截断向零 |
|
% 取模 |
✅ |
✅ |
✅(与除法一致) |
✅ |
|
自增自减 ++ — |
✅ |
❌(无) |
❌ |
✅ |
7 / 2 # 3.5
7 // 2 # 3
7 / 2 // 3(整数除法)
4.2 比较与逻辑
|
运算符 |
C |
Go |
Python |
Java |
|
== != |
✅ |
✅(slice/map 不可比) |
✅ |
✅ |
|
< > <= >= |
✅ |
✅ |
✅ |
✅ |
|
&& || |
✅ 短路 |
✅ |
and or 短路 |
✅ |
|
! |
✅ |
✅ |
not |
✅ |
|
三元 ?: |
✅ |
❌ 用 if |
x if c else y |
✅ |
Go 特殊:== 可用于 struct(字段都可比时)、array;不能比较 slice、map、func。
4.3 位运算
|
运算符 |
C |
Go |
Python |
Java |
|
& | ^ ~ |
✅ |
✅ |
✅(整数无限精度需注意) |
✅ |
|
<< >> |
✅ |
✅ |
✅ |
✅ |
|
&^ 位清除 |
❌ |
✅ Go 特有 |
❌ |
❌ |
C23 提供 <stdbit.h>:stdc_count_ones、stdc_leading_zeros 等可移植位操作。
4.4 赋值与复合赋值
四语言均支持 +=, -=, *=, /=, %=, 位运算复合赋值。
Go 独有::= 声明并赋值(非单纯赋值运算符)。
4.5 地址、解引用、成员访问
|
操作 |
C |
Go |
Python |
Java |
|
取地址 & |
✅ |
✅ |
❌ |
❌ |
|
解引用 * |
✅ |
✅ |
❌ |
❌ |
|
成员 . |
✅ |
✅ |
✅ |
✅ |
|
指针成员 -> |
✅ |
用 .(自动解引用) |
— |
— |
|
安全导航 |
— |
— |
无内置 |
?.(可选链无,但 Optional) |
4.6 运算符优先级(记忆版)
共同规律:一元 > 乘除 > 加减 > 移位 > 比较 > 相等 > 位与 > 位异或 > 位或 > 逻辑与 > 逻辑或 > 赋值
差异:
- Python 逻辑用英文单词,优先级更清晰
- Go 无 ++ 参与表达式(i++ 是语句)
- C 逗号运算符 , 可作为表达式一部分
4.7 类型相关运算符/表达式
|
特性 |
C |
Go |
Python |
Java |
|
sizeof |
✅ |
unsafe.Sizeof |
sys.getsizeof(对象大小) |
无 |
|
类型查询 |
_Generic(C11) |
reflect |
type(), isinstance |
instanceof |
|
类型 switch |
— |
switch x.(type) |
无 |
pattern matching |
4.8 易混点
05 控制流
5.1 条件分支 if
|
特性 |
C |
Go |
Python |
Java |
|
语法 |
if (cond) |
if cond(无括号) |
if cond: |
if (cond) |
|
else if |
✅ |
✅ |
elif |
else if |
|
条件类型 |
标量/指针 |
bool 必须 |
真值测试 |
boolean 必须 |
Python 真值测试
空容器、0、None、False 为假;其余多为真。
Go 的 if 初始化语句
if err := do(); err != nil {
return err
}
5.2 switch
|
特性 |
C |
Go |
Python |
Java |
|
形式 |
switch(expr) |
switch 可表达式/无标签 |
3.10+ match |
switch + 3.14+ 增强 pattern |
|
fallthrough |
默认贯穿 |
默认不贯穿 |
— |
默认不贯穿 |
|
多值匹配 |
需 case 1: case 2: |
逗号 case 1, 2: |
case 1 | 2: |
多 case 标签 |
|
类型 switch |
— |
switch x.(type) |
— |
pattern switch |
switch n {
case 1, 2:
fmt.Println("small")
default:
fmt.Println("other")
}
match command:
case "quit" | "exit":
break
case int(n) if n > 0:
print(n)
// Java 21+ switch 表达式
String result = switch (day) {
case MONDAY, FRIDAY -> "work";
case SATURDAY, SUNDAY -> "rest";
default -> "unknown";
};
5.3 循环
|
循环 |
C |
Go |
Python |
Java |
|
while |
while(cond) |
for cond {} |
while cond: |
while(cond) |
|
do-while |
do {} while |
无 |
无 |
do {} while |
|
for 三段式 |
✅ |
✅ |
— |
✅ |
|
for-each |
— |
for k, v := range |
for x in |
enhanced for |
|
无限循环 |
while(1) |
for {} |
while True |
while(true) |
for i := 0; i < n; i++ { }
for _, v := range slice { }
for i, v in enumerate(items):
…
5.4 跳转语句
|
语句 |
C |
Go |
Python |
Java |
|
break |
✅ |
✅ |
✅ |
✅ |
|
continue |
✅ |
✅ |
✅ |
✅ |
|
goto |
✅ |
✅(少用) |
无 |
无 |
|
return |
✅ |
✅ |
✅ |
✅ |
|
带标签 break |
— |
break Outer |
— |
— |
5.5 模式匹配(2026 水平)
|
语言 |
支持度 |
示例场景 |
|
C |
无 |
用 switch + 手动拆 |
|
Go |
无完整 PM |
switch + type assertion |
|
Python 3.10+ |
match/case |
结构、类、守卫 |
|
Java 21+ |
record pattern、switch |
instanceof + destructure |
// Java 25 预览:原语也可 pattern
if (obj instanceof int i) {
System.out.println(i);
}
5.6 异常与控制流(交叉)
|
语言 |
用异常做控制流? |
|
C |
否(goto/setjmp 极少) |
|
Go |
否(显式 error) |
|
Python |
偶尔(EAFP 风格) |
|
Java |
不推荐,但受检异常影响流程 |
Python EAFP:Easier to Ask Forgiveness than Permission
try:
return data[key]
except KeyError:
return default
5.7 易混点
06 函数与方法
6.1 函数定义语法
|
语言 |
语法要点 |
|
C |
返回类型在前;旧式 K&R 已在 C23 移除 |
|
Go |
func name(args) ret {};可多返回值 |
|
Python |
def name(args) -> ret: |
|
Java |
在 class 内;ReturnType name(args) |
int add(int a, int b) { return a + b; }
func divide(a, b int) (q int, err error) {
if b == 0 { return 0, errors.New("div by zero") }
return a / b, nil
}
def greet(name: str, *, loud: bool = False) -> str:
s = f"hello {name}"
return s.upper() if loud else s
public static int add(int a, int b) { return a + b; }
6.2 参数传递语义
|
语言 |
默认传递 |
说明 |
|
C |
值传递 |
数组名退化为指针;显式指针传递引用 |
|
Go |
值传递 |
slice/map/channel 是引用类型头;struct 大对象常传指针 |
|
Python |
对象引用传递 |
形参绑定到对象,重新赋值不影响外部变量 |
|
Java |
值传递(引用值) |
不能改引用指向,但能改对象内容 |
统一记忆:只有 C 有真正的“按值复制整个对象”;其余语言“值传递”常指传递指针/引用的副本。
6.3 多返回值 / 可选返回
|
语言 |
机制 |
|
C |
只能单返回;多结果用指针参数/out 或 struct |
|
Go |
原生多返回值 (T, error) |
|
Python |
return a, b → 实际是 tuple |
|
Java |
单返回;可用 record/Pair 或异常 |
6.4 默认参数 / 重载 / 可变参数
|
特性 |
C |
Go |
Python |
Java |
|
默认参数 |
❌ |
❌ |
✅ |
❌(重载代替) |
|
函数重载 |
❌(_Generic 模拟) |
❌ |
❌ |
✅ |
|
可变参数 |
… 无 |
…T |
*args |
String… args |
|
关键字参数 |
— |
— |
**kwargs |
— |
func sum(nums …int) int { … }
void log(String fmt, Object… args) { … }
6.5 闭包与高阶函数
|
语言 |
闭包 |
函数是一等公民 |
|
C |
无(函数指针) |
函数指针 |
|
Go |
✅ |
✅ |
|
Python |
✅ |
✅ |
|
Java |
lambda 捕获 effectively final |
✅(Java 8+) |
func counter() func() int {
n := 0
return func() int { n++; return n }
}
def counter():
n = 0
def inc():
nonlocal n
n += 1
return n
return inc
6.6 方法与接收者
|
语言 |
方法语法 |
接收者 |
|
C |
无;struct + 函数指针模拟 |
— |
|
Go |
func (r T) M() |
值/指针接收者 |
|
Python |
def method(self, …) |
self 显式 |
|
Java |
在 class 内定义 |
隐式 this |
Go 指针接收者:需要修改接收者或避免复制大 struct 时用 *T。
6.7 递归、内联、尾调用
|
语言 |
递归 |
尾调用优化 |
|
C |
✅ |
编译器可能优化 |
|
Go |
✅ |
不保证 |
|
Python |
✅(注意深度限制) |
无 |
|
Java |
✅ |
JVM 一般不优化为循环 |
6.8 易混点
07 字符串与字符
7.1 内部表示
|
语言 |
字符串编码 |
可变性 |
|
C |
字节序列 + \\0 终止;宽字符另说 |
可改(危险) |
|
Go |
UTF-8 字节序列 |
不可变 |
|
Python |
Unicode 码点(内部实现优化) |
不可变 |
|
Java |
UTF-16 char 序列 |
不可变 |
7.2 字面量形式
|
形式 |
C |
Go |
Python |
Java |
|
双引号 |
"hi" |
"hi" |
"hi" |
"hi" |
|
单引号字符 |
'a' |
字符用 rune 字面量 'a' |
无单字符类型 |
'a' |
|
原始/不转义 |
无 |
`raw` |
r"…" |
text block """…""" |
|
多行 |
拼接 |
反引号 |
""" |
text block |
|
格式化 |
printf |
fmt |
f-string f"{x}" |
String.format |
|
模板串(2026) |
— |
— |
t-string t"{x}" |
— |
Python 3.14 t-string
from string.templatelib import Template
name = "world"
tpl: Template = t"Hello, {name}!"
# 可遍历 tpl.strings / tpl.interpolations 做安全处理
7.3 常用操作对照
|
操作 |
C |
Go |
Python |
Java |
|
长度 |
strlen(O(n)) |
len(s) 字节数 |
len(s) 字符数 |
s.length() UTF-16 单元 |
|
拼接 |
strcat/snprintf |
+ / strings.Builder |
+ / join |
+ / StringBuilder |
|
切片 |
strncmp 等 |
s[i:j] |
s[i:j] |
substring |
|
查找 |
strstr |
strings.Contains |
in / find |
contains / indexOf |
|
分割 |
strtok |
strings.Split |
split |
split |
|
格式化 |
sprintf |
fmt.Sprintf |
f-string |
formatted(Java 21+) |
7.4 转义与 Unicode
|
语言 |
常见转义 |
Unicode |
|
C |
\\n \\t \\\\ \\" |
\\uXXXX(C11/u8) |
|
Go |
同 C + ` 内不转义 |
\\u \\U |
|
Python |
\\n \\t |
\\u \\U \\N{name} |
|
Java |
\\n \\t |
\\uXXXX |
7.5 C 字符串特别说明
char s[] = "hi"; // 可修改数组
char *p = "hi"; // 字符串字面量,常不可写
// C23
const char *q = u8"你好";
经典坑
- char * 与 char[] 不同
- sizeof(s) vs strlen(s)
- 缓冲区溢出 → 用 snprintf、边界检查
7.6 Go 字符串与 rune
s := "你好"
for i, r := range s { // r 是 rune,i 是字节偏移
_ = i; _ = r
}
len(s) 是字节数,不是字符数;计数用 utf8.RuneCountInString。
7.7 易混点
08 集合与复合结构
8.1 数组 / 定长序列
|
语言 |
语法 |
长度 |
越界 |
|
C |
int a[10] |
编译期常量 |
未定义行为 |
|
Go |
[10]int |
类型一部分 |
编译/运行 panic |
|
Python |
无真数组;array.array 少用 |
— |
IndexError |
|
Java |
int[] a = new int[10] |
运行时 |
ArrayIndexOutOfBounds |
8.2 动态序列
|
语言 |
核心类型 |
扩容 |
|
C |
手动 malloc + realloc |
程序员负责 |
|
Go |
slice []T |
自动,共享底层数组 |
|
Python |
list |
自动 |
|
Java |
ArrayList<T> |
自动 |
s := make([]int, 0, 10) // len=0, cap=10
s = append(s, 1)
lst = [1, 2, 3]
lst.append(4)
var list = new ArrayList<Integer>();
list.add(1);
Go slice 三要素
pointer + len + cap —— 理解 slice 是学 Go 的关键。
8.3 映射(键值对)
|
语言 |
类型 |
有序? |
缺失键 |
|
C |
无;用哈希库或自己实现 |
— |
— |
|
Go |
map[K]V |
遍历顺序随机 |
零值 + ok |
|
Python |
dict |
3.7+ 插入有序 |
KeyError / get |
|
Java |
HashMap / LinkedHashMap |
Hash 无序 |
null / getOrDefault |
v, ok := m["key"]
if !ok { /* 不存在 */ }
v = d.get("key", default)
8.4 结构体 / 记录
|
语言 |
定义 |
特点 |
|
C |
struct Point { int x, y; }; |
内存布局可控,可对齐 |
|
Go |
type Point struct { X, Y int } |
导出字段靠首字母大写 |
|
Python |
@dataclass / class |
动态属性 |
|
Java |
class / record |
record 不可变数据载体 |
record Point(int x, int y) {}
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
8.5 集合类型扩展
|
类型 |
C |
Go |
Python |
Java |
|
集合 Set |
无 |
map[T]struct{} 惯用法 |
set |
HashSet |
|
队列 |
手写 |
container/list 或 channel |
deque |
Queue |
|
栈 |
手写 |
slice 模拟 |
list 模拟 |
Deque |
|
元组 |
无 |
无 |
tuple |
无(record 替代) |
8.6 迭代
|
语言 |
惯用法 |
|
C |
for (i=0; i<n; i++) 或指针遍历 |
|
Go |
for i, v := range |
|
Python |
for x in iterable |
|
Java |
enhanced for 或 Iterator / Stream |
8.7 内存布局(C/Go 重点)
C struct 填充(padding) 影响 ABI、网络协议、嵌入式。
struct S { char a; int b; }; // 可能有 3 字节 padding
Go 编译器也会对齐,可用 unsafe 分析但不建议依赖。
Python/Java 对象布局对用户不透明。
8.8 易混点
09 指针引用内存
9.1 有无指针
|
语言 |
用户层指针 |
空值 |
|
C |
✅ 核心 |
NULL / nullptr |
|
Go |
✅ 有限使用 |
nil |
|
Python |
❌ 一切是引用 |
None |
|
Java |
❌ 只有引用类型 |
null |
9.2 指针基础(C / Go)
int x = 10;
int *p = &x;
*p = 20;
x := 10
p := &x
*p = 20
|
概念 |
C |
Go |
|
取址 |
& |
& |
|
解引用 |
* |
* |
|
指针算术 |
✅ p++ |
❌ |
|
函数指针 |
✅ |
✅ func 类型 |
9.3 内存分配与释放
|
语言 |
分配 |
释放 |
|
C |
malloc / calloc / realloc / aligned_alloc |
free |
|
C23 |
同上 + strdup 等标准函数 |
free |
|
Go |
new(T) / make / 取址 |
GC 自动 |
|
Python |
自动 |
GC 自动 |
|
Java |
new |
GC 自动 |
Go 1.26:new(expr)
p := new(42) // *int,值为 42
age := new(18) // 用于可选 JSON 字段等
旧写法:v := 42; p := &v
9.4 栈 vs 堆
|
语言 |
谁决定 |
|
C |
程序员(局部通常在栈,malloc 在堆) |
|
Go |
逃逸分析 编译器决定 |
|
Python/Java |
运行时 + JIT,对开发者透明 |
9.5 垃圾回收
|
语言 |
机制 |
程序员职责 |
|
C |
无 |
手动 free,防泄漏/悬垂 |
|
Go |
并发 GC(1.26 Green Tea 默认) |
注意 goroutine 泄漏 |
|
Python |
引用计数 + 循环 GC |
注意全局引用 |
|
Java |
分代 GC(G1/ZGC/Shenandoah) |
注意静态集合持有引用 |
9.6 常见内存问题
|
问题 |
C |
Go |
Python |
Java |
|
内存泄漏 |
✅ 高发 |
较少 |
较少 |
较少 |
|
悬垂指针 |
✅ |
GC 避免 |
GC 避免 |
GC 避免 |
|
双重释放 |
✅ |
— |
— |
— |
|
缓冲区溢出 |
✅ |
边界检查 |
边界检查 |
边界检查 |
|
数据竞争 |
✅ |
✅ race detector |
GIL/锁 |
✅ |
C23 memset_explicit:安全擦除敏感内存。
9.7 引用语义对比
Java
StringBuilder sb = new StringBuilder();
foo(sb); // 可修改对象内容
Python
def foo(lst):
lst.append(1) # 修改外部可见
Go — 传 slice 可改底层元素:
func add1(s []int) { s[0]++ } // 外部 slice 元素会变
9.8 unsafe / 底层操作
|
语言 |
机制 |
|
C |
全是 unsafe |
|
Go |
unsafe 包 + unsafe.Pointer |
|
Python |
ctypes / C 扩展 |
|
Java |
Foreign Function & Memory API(替代 JNI 方向) |
9.9 易混点
10 输入输出
10.1 标准流模型
|
语言 |
stdin |
stdout |
stderr |
|
C |
stdin |
stdout |
stderr |
|
Go |
os.Stdin |
os.Stdout |
os.Stderr |
|
Python |
sys.stdin |
sys.stdout |
sys.stderr |
|
Java |
System.in |
System.out |
System.err |
10.2 控制台输出
|
语言 |
最简输出 |
格式化输出 |
|
C |
puts("hi") |
printf("%d\\n", n) |
|
Go |
fmt.Println("hi") |
fmt.Printf("%d\\n", n) |
|
Python |
print("hi") |
print(f"{n}") / format |
|
Java |
System.out.println("hi") |
System.out.printf("%d%n", n) |
换行差异
- C printf 不自动换行
- Go Println 自动换行
- Python print 默认换行,end= 可改
- Java println 自动换行
10.3 控制台输入
|
语言 |
读一行 |
读格式化 |
|
C |
fgets(buf, size, stdin) |
scanf("%d", &n) |
|
Go |
bufio.NewReader / fmt.Scanln |
fmt.Scanf |
|
Python |
input() |
手动转换 int(input()) |
|
Java |
Scanner.nextLine() |
Scanner.nextInt() |
// C:scanf 有缓冲区溢出风险,优先 fgets + sscanf
char line[128];
if (fgets(line, sizeof line, stdin))
sscanf(line, "%d", &n);
reader := bufio.NewReader(os.Stdin)
line, _ := reader.ReadString('\\n')
line = input().strip()
n = int(line)
var sc = new Scanner(System.in);
int n = sc.nextInt();
10.4 文件 I/O
|
语言 |
打开 |
读文本 |
写文本 |
关闭 |
|
C |
fopen |
fgets/fread |
fprintf/fwrite |
fclose |
|
Go |
os.Open |
io.ReadAll |
os.WriteFile |
defer f.Close() |
|
Python |
open() |
read() |
write() |
with 自动 |
|
Java |
Files / FileReader |
readString |
writeString |
try-with-resources |
Python 推荐
with open("data.txt", encoding="utf-8") as f:
content = f.read()
Go 推荐
data, err := os.ReadFile("data.txt")
Java 推荐
String s = Files.readString(Path.of("data.txt"));
10.5 二进制 I/O
|
语言 |
方式 |
|
C |
fread/fwrite + memcpy |
|
C23 |
#embed "file.bin" 编译期嵌入 |
|
Go |
encoding/binary 大端小端 |
|
Python |
struct.pack / unpack |
|
Java |
DataInputStream / ByteBuffer |
// C23 嵌入资源
const unsigned char icon[] = {
#embed "icon.png"
};
10.6 缓冲 I/O
|
语言 |
缓冲 |
|
C |
全缓冲 stdio,setvbuf 可调 |
|
Go |
bufio.Reader/Writer |
|
Python |
文本 IO 默认缓冲 |
|
Java |
BufferedReader |
教训:C/Go 的 printf 无换行时可能因缓冲延迟显示;调试可加 \\n 或 fflush(stdout)。
10.7 序列化(JSON 等)
|
语言 |
JSON 常用库 |
|
C |
cJSON, jansson(第三方) |
|
Go |
encoding/json(1.27 将有 v2) |
|
Python |
json 标准库 |
|
Java |
Jackson / Gson / javax.json |
10.8 易混点
11 错误与异常
11.1 对照
|
语言 |
主模型 |
理念 |
|
C |
返回码 + errno |
程序员显式检查每一步 |
|
Go |
error 值 |
错误是值,不是控制流 |
|
Python |
异常 |
EAFP:先做事,出错再捕获 |
|
Java |
异常 |
受检 + 非受检双轨 |
11.2 C:返回码与 errno
#include <errno.h>
#include <string.h>
FILE *f = fopen("missing.txt", "r");
if (!f) {
fprintf(stderr, "open failed: %s\\n", strerror(errno));
return 1;
}
|
机制 |
用途 |
|
函数返回值 |
NULL、-1、EOF 表示失败 |
|
errno |
系统调用错误码 |
|
perror / strerror |
人类可读消息 |
无异常,也无强制检查返回码——C 最大风险源。
11.3 Go:error 接口
func readConfig(path string) ([]byte, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("read config %s: %w", path, err)
}
return data, nil
}
|
要点 |
说明 |
|
error 是接口 |
Error() string |
|
惯用法 |
if err != nil { return … } |
|
包装 |
fmt.Errorf("…: %w", err) |
|
panic |
仅用于不可恢复编程错误 |
Go 没有 try/catch;panic/recover 类似 defer 级异常,不用于业务错误。
11.4 Python:异常
try:
with open("missing.txt", encoding="utf-8") as f:
data = f.read()
except FileNotFoundError as e:
print("not found:", e)
except OSError as e:
print("io error:", e)
else:
print("ok", len(data))
finally:
print("cleanup")
|
语法 |
3.14 更新 |
|
except X: |
可写 except X 省略括号(PEP 758) |
|
except* |
ExceptionGroup 相关 |
|
finally |
禁止 return/break/continue 跳出(PEP 765) |
11.5 Java:受检与非受检
try {
Files.readString(Path.of("missing.txt"));
} catch (IOException e) {
throw new RuntimeException(e);
}
|
类型 |
继承 |
必须处理? |
|
受检 |
Exception(非 Runtime) |
编译器强制 try/catch 或 throws |
|
非受检 |
RuntimeException |
否 |
|
错误 |
Error |
一般不捕 |
现代 Java 趋势:新 API 更少受检异常;用 Optional / Result 风格在库层表达。
11.6 四语言错误处理对照表
|
场景 |
C |
Go |
Python |
Java |
|
文件不存在 |
NULL + errno |
error 包装 os.ErrNotExist |
FileNotFoundError |
NoSuchFileException |
|
除零 |
未定义行为/ SIGFPE |
panic(整数除零) |
ZeroDivisionError |
ArithmeticException |
|
类型错误 |
编译期 |
编译期 |
TypeError |
编译期 |
|
自定义错误 |
错误码枚举 |
errors.New / 自定义类型 |
继承 Exception |
继承 Exception |
11.7 资源管理与错误
|
语言 |
RAII / 自动清理 |
|
C |
手动;goto cleanup 模式 |
|
Go |
defer |
|
Python |
with 上下文管理器 |
|
Java |
try-with-resources |
f, err := os.Open(path)
if err != nil { return err }
defer f.Close()
11.8 选型直觉
- C:每个调用都检查;失败路径与成功路径同样重要。
- Go:错误是返回值的一部分;链式 if err != nil 是文化。
- Python:用异常表达“意外”;不要用异常做普通分支。
- Java:API 设计要想清楚受检异常是否值得。
11.9 易混点
12 面向对象与组合
12.1 范式定位
|
语言 |
官方范式 |
现实写法 |
|
C |
过程式 |
struct + 函数指针模拟 OOP |
|
Go |
组合优于继承 |
struct + interface |
|
Python |
多范式 OOP |
类 + 魔术方法 |
|
Java |
单继承 OOP |
class + interface + record |
12.2 类 / 结构体定义
|
语言 |
定义 |
构造 |
|
C |
struct |
手动初始化字段 |
|
Go |
type T struct |
字面量 T{a:1} |
|
Python |
class T: |
__init__ |
|
Java |
class T / record T |
构造器 |
class Dog:
def __init__(self, name: str):
self.name = name
def bark(self) -> str:
return "woof"
public class Dog {
private final String name;
public Dog(String name) { this.name = name; }
public String bark() { return "woof"; }
}
12.3 继承 vs 组合
|
语言 |
继承 |
推荐 |
|
C |
无 |
组合 struct |
|
Go |
无类继承 |
嵌入 struct(匿名字段) |
|
Python |
单继承 + Mixin |
组合 + 协议 |
|
Java |
单继承 class |
接口组合 |
Go 嵌入(组合)
type Engine struct { Power int }
type Car struct {
Engine // 匿名字段,方法提升
Brand string
}
Python 继承
class Animal: …
class Dog(Animal): …
Java
class Dog extends Animal implements Pet { }
12.4 接口 / 抽象
|
语言 |
接口机制 |
实现方式 |
|
C |
函数指针表 vtable |
手动 |
|
Go |
interface 隐式实现 |
无需 implements |
|
Python |
类型 + Protocol |
有方法即可 |
|
Java |
interface 显式实现 |
implements |
type Reader interface {
Read(p []byte) (n int, err error)
}
// 任何有 Read 方法的类型都满足 Reader
interface Readable {
int read(byte[] buf);
}
class MyReader implements Readable { … }
12.5 多态
|
语言 |
机制 |
|
C |
函数指针 / _Generic |
|
Go |
interface 动态分发 |
|
Python |
运行时方法查找 |
|
Java |
虚方法表 + interface |
12.6 访问控制
|
语言 |
public |
private |
protected |
包可见 |
|
C |
约定 |
约定 |
— |
static 文件内 |
|
Go |
大写导出 |
小写包内 |
— |
包级 |
|
Python |
无强制 |
_ 约定 |
— |
— |
|
Java |
public |
private |
protected |
默认包私有 |
Go 规则:Foo 导出,foo 不导出——极简但有效。
12.7 特殊 OOP 特性
|
特性 |
C |
Go |
Python |
Java |
|
抽象类 |
模拟 |
无 |
abc.ABC |
abstract class |
|
静态方法 |
无 |
无(包级函数) |
@staticmethod |
static |
|
类方法 |
— |
— |
@classmethod |
static 工厂 |
|
属性 getter |
— |
— |
@property |
getter/setter |
|
record/数据类 |
— |
— |
@dataclass |
record |
|
枚举 |
enum(C23) |
iota 常量组 |
Enum |
enum |
|
析构 |
无 |
无 |
__del__(少用) |
finalize 废弃 |
12.8 Java record 与 Python dataclass
record User(String name, int age) {
public User {
if (age < 0) throw new IllegalArgumentException();
}
}
from dataclasses import dataclass
@dataclass(frozen=True)
class User:
name: str
age: int
两者都适合不可变数据载体,替代冗长 POJO。
12.9 易混点
13 泛型与类型参数
13.1 支持概览
|
语言 |
泛型 |
引入版本 |
类型擦除? |
|
C |
宏 + _Generic |
C11 |
预处理/编译期选择 |
|
Go |
✅ 泛型 |
Go 1.18 |
单态化(monomorphization) |
|
Python |
类型参数(PEP 695) |
3.12+ |
运行时擦除(注解用) |
|
Java |
✅ 泛型 |
Java 5 |
有擦除 |
13.2 C:宏与 _Generic
#define MAX(a, b) ((a) > (b) ? (a) : (b)) // 副作用陷阱
// C11 _Generic:类型分发
#define print_val(x) _Generic((x), \\
int: print_int, \\
double: print_double \\
)(x)
C23 改进了 _Generic;但 C 仍无真正“类型参数函数”。
13.3 Go 泛型
func Map[T, U any](slice []T, f func(T) U) []U {
out := make([]U, len(slice))
for i, v := range slice {
out[i] = f(v)
}
return out
}
type Stack[T any] struct { items []T }
func (s *Stack[T]) Push(v T) { s.items = append(s.items, v) }
|
概念 |
语法 |
|
类型参数 |
[T any] |
|
约束 |
interface 约束集 |
|
实例化 |
通常自动推断 |
Go 1.26:泛型类型可自引用约束。
Go 1.27(前瞻):泛型方法 func (s *Set[T]) Union[U …](…)
13.4 Python 类型参数
# PEP 695 风格
def first[T](items: list[T]) -> T:
return items[0]
class Stack[T]:
def __init__(self) -> None:
self._items: list[T] = []
def push(self, item: T) -> None:
self._items.append(item)
|
要点 |
说明 |
|
运行时 |
仍是鸭子类型,泛型主要服务静态检查 |
|
TypeVar |
旧写法仍可用 |
|
联合 |
`int |
Python 3.14:注解延迟求值,前向引用更简单。
13.5 Java 泛型
public static <T> T first(List<T> list) {
return list.get(0);
}
public class Box<T> {
private T value;
public T get() { return value; }
}
|
限制 |
原因 |
|
不能用 int 作类型参数 |
擦除 + 原始类型并行 |
|
不能 new T() |
擦除 |
|
不能创建 T[] |
数组协变问题 |
原始类型 workaround:List<int> 不存在 → List<Integer>。
Java 25+ 改进方向
- 更丰富的 pattern matching
- Primitive Types in Patterns(预览):减少装箱
13.6 约束 / 边界对照
|
语言 |
约束写法 |
|
Go |
interface{ ~int | ~int64 } 等 |
|
Python |
T: Comparable / bound= |
|
Java |
<T extends Number> |
public <T extends Comparable<T>> T max(T a, T b) {
return a.compareTo(b) >= 0 ? a : b;
}
13.7 协变与逆变(进阶)
|
语言 |
数组/集合协变 |
|
C |
无泛型集合 |
|
Go |
slice 不变;interface 有协变感觉 |
|
Python |
类型检查器处理 |
|
Java |
数组协变(String[] 是 Object[]);泛型不变 |
List<String> list = List.of("a");
// List<Object> objs = list; // 编译错误
13.8 易混点
14 并发模型
14.1 总览
|
语言 |
核心模型 |
默认并行? |
|
C |
pthread / 手动线程 |
是(OS 线程) |
|
Go |
goroutine + channel(CSP) |
M:N 调度 |
|
Python |
threading / asyncio / multiprocessing |
GIL 限制 CPU 并行(3.14 可选自由线程) |
|
Java |
Thread / 虚拟线程 / java.util.concurrent |
真并行 |
14.2 C:POSIX 线程
#include <pthread.h>
void *worker(void *arg) {
// …
return NULL;
}
pthread_t t;
pthread_create(&t, NULL, worker, NULL);
pthread_join(t, NULL);
|
要点 |
说明 |
|
同步 |
mutex, cond, semaphore |
|
风险 |
数据竞争、死锁、悬垂指针 |
|
工具 |
ThreadSanitizer, Valgrind |
C 没有语言级并发原语,全靠库和纪律。
14.3 Go:goroutine 与 channel
ch := make(chan int, 10)
go func() {
ch <- 42
}()
v := <-ch
|
概念 |
说明 |
|
go f() |
启动 goroutine,极轻量 |
|
chan T |
CSP 通信 |
|
select |
多路复用 |
|
sync.Mutex |
共享内存时备用 |
|
context |
取消与超时传播 |
口号:Don't communicate by sharing memory; share memory by communicating.
Go 1.26:实验性 goroutine 泄漏检测工具。
14.4 Python:GIL、asyncio、多进程
threading(I/O 密集)
import threading
def work():
…
t = threading.Thread(target=work)
t.start()
t.join()
CPython GIL:同一时刻只有一个线程执行 Python 字节码 → CPU 密集 用 multiprocessing。
asyncio(协作式并发)
import asyncio
async def fetch():
await asyncio.sleep(1)
return "ok"
asyncio.run(fetch())
Python 3.14 自由线程(可选构建)
- PEP 779:无 GIL 构建官方支持
- 需专门安装 python3.14t 类构建
- 扩展模块兼容性仍在演进
14.5 Java:平台线程与虚拟线程
传统线程
Thread t = Thread.ofPlatform().start(() -> {
System.out.println("hi");
});
t.join();
虚拟线程(Java 21+,生产可用)
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> System.out.println("vt"));
}
|
特性 |
平台线程 |
虚拟线程 |
|
数量级 |
数千 |
数百万 |
|
调度 |
OS |
JVM |
|
适用 |
CPU 密集 |
I/O 密集 |
Java 25 定稿:Scoped Values
// 替代 ThreadLocal,不可变、低开销
ScopedValue.where(KEY, value).run(() -> { … });
Java 26 预览:Structured Concurrency
把子任务生命周期绑定到父作用域,失败时自动取消兄弟任务。
14.6 同步原语对照
|
原语 |
C |
Go |
Python |
Java |
|
互斥锁 |
pthread_mutex |
sync.Mutex |
threading.Lock |
synchronized / ReentrantLock |
|
条件变量 |
pthread_cond |
sync.Cond |
Condition |
Condition |
|
信号量 |
sem_t |
第三方/chan |
Semaphore |
Semaphore |
|
原子操作 |
_Atomic |
sync/atomic |
有限 |
AtomicInteger 等 |
|
WaitGroup |
手动 |
sync.WaitGroup |
Barrier |
CountDownLatch |
14.7 并发选型建议
|
场景 |
首选 |
|
系统底层、极致控制 |
C |
|
云原生网络服务 |
Go |
|
脚本、数据胶水、async Web |
Python |
|
企业后端、JVM 生态 |
Java(虚拟线程处理 I/O) |
14.8 易混点
15 模块包依赖
15.1 组织单元对照
|
语言 |
逻辑单元 |
物理单元 |
导入语句 |
|
C |
无模块;编译单元 .c |
.h + .c |
#include |
|
Go |
package |
目录 = 包 |
import "path" |
|
Python |
module |
.py 文件 |
import / from |
|
Java |
package |
目录结构 = 包 |
import |
15.2 C:头文件与链接
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// main.c
#include "math_utils.h"
|
阶段 |
工具 |
|
预处理 |
#include, #ifdef |
|
编译 |
各 .c → .o |
|
链接 |
gcc … -o app |
C23:#embed 可把资源编进翻译单元。
依赖管理:无统一标准 → Makefile, CMake, Meson, vcpkg, Conan。
15.3 Go:module
myapp/
go.mod
go.sum
cmd/app/main.go
internal/pkg/…
module example.com/myapp
go 1.26
require (
golang.org/x/sync v0.10.0
)
|
命令 |
作用 |
|
go mod init |
初始化模块 |
|
go get pkg@version |
加依赖 |
|
go mod tidy |
整理依赖 |
可见性:internal/ 目录外不可导入(编译器强制)。
15.4 Python:包与 pyproject
myproject/
pyproject.toml
src/myapp/
__init__.py
main.py
[project]
name = "myapp"
version = "0.1.0"
dependencies = ["requests>=2.31"]
|
工具 |
用途 |
|
pip |
安装 |
|
venv |
虚拟环境 |
|
uv / poetry |
现代依赖锁定 |
import myapp.utils
from myapp.utils import helper
Python 3.14:
标准库多解释器支持(concurrent.interpreters),与打包独立。
15.5 Java:包、模块系统、构建
传统包
src/com/example/app/Main.java
package com.example.app;
Java 9+ 模块(module-info.java)
module com.example.app {
requires java.logging;
exports com.example.api;
}
Java 25:Module Import Declarations(定稿)
import module java.base;
// 简化入门,减少冗长 import
|
构建工具 |
说明 |
|
Maven |
pom.xml |
|
Gradle |
build.gradle.kts |
15.6 版本与发布
|
语言 |
版本语义 |
注册中心 |
|
C |
库各自版本 |
无中心 |
|
Go |
MVS 最小版本选择 |
模块代理 proxy.golang.org |
|
Python |
PEP 440 |
PyPI |
|
Java |
Maven 坐标 |
Maven Central |
15.7 可见性总结
|
级别 |
Go |
Python |
Java |
|
公开 |
大写标识符 |
无下划线 |
public |
|
内部 |
小写 |
_ 前缀 |
package-private |
|
私有 |
— |
__ 名修饰 |
private |
C 靠 static 限制文件作用域 + 头文件只暴露声明。
15.8 易混点
16 标准库速览与学习路径
16.1 标准库哲学
|
语言 |
规模 |
特点 |
|
C |
极小(C23 略增) |
偏底层;其余靠 POSIX/第三方 |
|
Go |
中等偏大 |
电池够用,风格统一 |
|
Python |
大而全 |
“自带电池” |
|
Java |
超大(JDK) |
企业级 API 齐全 |
16.2 按领域对照
字符串与文本
|
领域 |
C |
Go |
Python |
Java |
|
核心 |
<string.h>, <ctype.h> |
strings, strconv, unicode/utf8 |
str, re |
java.lang.String |
|
格式化 |
printf 家族 |
fmt |
f-string, t-string |
String.formatted |
容器与算法
|
领域 |
C |
Go |
Python |
Java |
|
动态数组 |
手写 |
slice + append |
list |
ArrayList |
|
映射 |
手写/uthash |
map |
dict |
HashMap |
|
算法 |
qsort, bsearch |
sort |
sorted, heapq |
Collections |
I/O 与文件
|
领域 |
C |
Go |
Python |
Java |
|
文件 |
stdio, fcntl |
os, io, bufio |
pathlib, open |
java.nio.file |
|
网络 |
Berkeley sockets |
net, net/http |
socket, urllib, asyncio |
java.net, HttpClient |
时间与随机
|
领域 |
C |
Go |
Python |
Java |
|
时间 |
<time.h> |
time |
datetime |
java.time |
|
随机 |
rand |
math/rand, crypto/rand |
random, secrets |
Random, SecureRandom |
加密与安全
|
领域 |
C |
Go |
Python |
Java |
|
哈希 |
OpenSSL 等 |
crypto/* |
hashlib |
MessageDigest |
|
TLS |
OpenSSL |
crypto/tls |
ssl |
javax.net.ssl |
测试
|
语言 |
框架 |
|
C |
Unity, Criterion, Check |
|
Go |
testing, testify |
|
Python |
pytest, unittest |
|
Java |
JUnit 5 |
并发
|
语言 |
库 |
|
C |
pthread |
|
Go |
sync, context, goroutine 内置 |
|
Python |
threading, asyncio, multiprocessing |
|
Java |
java.util.concurrent, 虚拟线程 API |
16.3 C23 新增库要点
|
头文件 |
作用 |
|
<stdbit.h> |
位计数、前导零等 |
|
<stdckdint.h> |
checked 整数运算防溢出 |
|
char8_t / UTF-8 API |
国际化文本 |
|
memset_explicit |
安全清零 |
|
strdup / strndup |
字符串复制进标准 |
16.4 Python 3.14 值得知道的标准库
|
模块 |
作用 |
|
string.templatelib |
t-string 处理 |
|
compression.zstd |
Zstandard 压缩 |
|
concurrent.interpreters |
子解释器 |
|
asyncio 增强 |
更强 introspection |
|
pdb |
可 attach 运行中进程 |
16.5 Java 25/26 值得知道的标准库
|
API |
状态 |
|
虚拟线程 Executors.newVirtualThreadPerTaskExecutor |
定稿 |
|
Scoped Values |
定稿(25) |
|
Structured Concurrency |
预览(26) |
|
HttpClient HTTP/3 |
26 |
|
Vector API |
孵化器 |
|
Foreign Function & Memory |
替代 JNI 的现代本地接口 |
16.6 Go 1.26/1.27 标准库动态
|
包 |
说明 |
|
crypto/hpke |
1.26 新增混合公钥加密 |
|
testing/cryptotest |
加密测试辅助 |
|
encoding/json/v2 |
1.27 大改版(与 v1 并存) |
|
simd/archsimd |
1.26 实验性 SIMD |
16.7 推荐学习路径(交叉强化)
阶段 1:共性基础(2–3 周)
阶段 2:数据结构(3–4 周)
阶段 3:抽象与工程(4–6 周)
阶段 4:系统能力(按兴趣)
|
方向 |
主攻语言 |
|
系统/嵌入式 |
C |
|
后端服务 |
Go / Java |
|
数据/自动化 |
Python |
|
高并发 I/O |
Go + Java 虚线程 + Python asyncio |
阶段 5:2026 新特性补课
- C23:nullptr, #embed, <stdbit.h>
- Go 1.26:new(expr), 泛型自引用
- Python 3.14:t-string, 延迟注解
- Java 25:compact main, scoped values, record
16.8 工具链速查
|
语言 |
格式化 |
静态检查 |
包管理 |
|
C |
clang-format |
clang-tidy, cppcheck |
CMake/Conan |
|
Go |
gofmt/goimports |
go vet, staticcheck |
go modules |
|
Python |
black, ruff format |
ruff, mypy, pyright |
pip/uv/poetry |
|
Java |
google-java-format |
SpotBugs, Error Prone |
Maven/Gradle |
网硕互联帮助中心


评论前必须登录!
注册