跳转到内容

第三部分导读:数据

程序处理的东西归根结底是数据,而同一份数据常常带来三个问题:怎么存,怎么一个一个取出来,以及它只可能是有限几种情况之一时怎么表达。这一部分讲的共同问题是:同一份数据在四种语言里怎么存、怎么遍历、怎么表达几种可能。

先看“存”。一批货品名要去重、计数、求交集,四种语言都有内置的动态数组和哈希表,可一遍历字典,Python 的字典和 JS 的 Map 按插入顺序给你,C# 不保证顺序,Go 故意打乱。再看“取”。一串数据太长甚至没有尽头时,要用到哪里算到哪里,Python、JS/TS、C# 靠生成器,Go 1.23 起靠接收回调的函数。字符串也是一种数据:昵称 héllo😀,Python 数出 6,JS/TS 和 C# 数出 7,Go 数出 10,各自没有错,只是数的层不同。最后是“几种可能”:支付结果只有成功、被拒、处理中三种,TS 能让编译器查出漏处理的一种,Go 要等到运行时。

这一部分建立在前面几章之上。提前结束遍历时怎样保证清理,接着第 10 章的错误处理与资源清理;枚举与联合类型能不能在编译期查漏,取决于第 3 章讲的类型系统。读不顺时可以回头查。

章 一句话 四种语言差异最大的一点
第 12 章 集合:列表、字典、集合与不可变集合 一批数据怎么存、按键查、去重,并防止被改 字典的遍历顺序:同样是哈希表,四种语言给出保证、部分保证(指 JS 普通对象)、不保证、故意打乱四种答案
第 13 章 迭代与惰性 数据太长或没有尽头时,一个一个取,用到哪里算到哪里 实现机制:同样是 yield,Python 和 JS 由运行时保存帧,C# 由编译器改写成类,Go 没有可暂停的函数,控制方向也倒了过来
第 14 章 字符串与编码 同一段文字按哪一层去数,“长度”才有确定的含义 len / length 数的是什么:同一个昵称,四种语言给出 6、7、7、10 三种答案
第 15 章 枚举、联合类型与模式匹配 把“只有这几种情况”写进类型,处理时保证每种都照顾到 穷尽性检查:漏处理一种情况,在 TS 里是编译错误,在 C# 里是警告或运行时异常,在 Python 里取决于有没有跑检查器,在 JS 和 Go 里只能等它真的发生

下面这张图列出这部分的四类问题,以及各自该翻的章。

遇到的问题与该看的章

图的左列是你可能遇到的问题,右列是该先翻的章。

遇到什么问题先看哪章:

  • 你想存一批数据、按键查、去重,或者想知道遍历字典的顺序靠不靠得住 → 看第 12 章 集合。
  • 你想处理一串很长甚至没有尽头的数据,不想一次全算出来 → 看第 13 章 迭代与惰性。
  • 你想知道一段文字有多长、怎么按字切开,或者前端、后端、数据库算出的长度为什么对不上 → 看第 14 章 字符串与编码。
  • 你想让一个值只能是有限几种情况之一,并保证每种都处理到 → 看第 15 章 枚举、联合类型与模式匹配。