我用 new Date 造了个 6 月 1 日,它却给我变成了 7 月 1 日;后端传来的日期前端显示又差了一天:一次 JavaScript Date 月份从 0 开始与解析时区的深度复盘

我用 JS 的 Date 处理日期出了两件诡异的事:想构造 2026 年 6 月 1 日写了 new Date(2026, 6, 1),打印出来居然是 7 月 1 日;后端传来 '2026-06-02',new Date 解析后展示给用户,有些用户看到的是 6 月 1 日差了一天。查清才明白是 JS Date 的两个经典坑:一是 Date 的月份从 0 开始(0=一月、6=七月),而日从 1 开始、年正常,偏偏月份从 0、极不一致,所以 6 被当成了第 7 个月;二是 new Date 解析字符串时不同格式时区假设不同,'2026-06-02' 这种 ISO 纯日期格式按 UTC 解析,东八区显示就容易差一天。这篇复盘从故障现场讲到 JS Date 月份 0-based、解析时区随格式变、可变、命名易混等历史遗留的坑,再到优先用现代日期库(dayjs/date-fns/Temporal)、裸用 Date 谨记月份 N-1、明确解析格式和时区的完整正解,以及 API 应名副其实符合直觉最小惊讶、广泛依赖的接口设计错误会因兼容性永久冻结、最天经地义的常识是最危险的盲区遇诡异问题要敢验证最不可能错的假设的认知。

我用 new Date 造了个"6 月 1 日",它却给我变成了 7 月 1 日;后端传来的日期前端显示又差了一天:一次 JavaScript Date 月份从 0 开始与解析时区的深度复盘

那两个日期 bug 是用户反馈"日期不对"才暴露的:我用 JavaScript 的 Date 处理日期,出了两件诡异的事。第一件:我想构造"2026 年 6 月 1 日",写了 new Date(2026, 6, 1),结果打印出来居然是 7 月 1 日!第二件:后端传来一个日期字符串 "2026-06-02",我 new Date("2026-06-02") 解析后展示给用户,有些用户看到的是 6 月 1 日,差了一天。我盯着这两个"日期凭空错位"查了好久,把 JS Date 的行为查清,才看明白,后背发凉:这是 JavaScript Date 的两个经典坑。第一个坑:Date月份是从 0 开始的(0-based)——new Date(year, month, day) 里的 month,0 表示一月、6 表示七月;getMonth() 返回的也是 0-11;日(day)却是从 1 开始的(1-based),年也是正常的——偏偏月份从 0 开始,极其反直觉、和其他字段不一致;所以我写 new Date(2026, 6, 1),那个 6 被当成了"第 7 个月",造出了 7 月 1 日;第二个坑:new Date(字符串) 解析时,不同格式的时区假设不同——"2026-06-02" 这种 ISO 的纯日期格式,会被按 UTC 解析(当成 UTC 的 0 点);而在东八区(UTC+8)显示时,UTC 的 6 月 2 日 0 点 = 北京时间 6 月 2 日 8 点,但若再被当本地 0 点取日期/或某些转换,就差了一天(显示成 6 月 1 日)。根本原因是:JS Date 的设计有反直觉的坑——月份从 0 开始(和日/年不一致)、字符串解析的时区假设随格式而变;不了解这些隐含规则,日期就会凭空错位。问题的根,是 JS Date 月份从 0 开始(6 是 7 月)、且 "2026-06-02" 这种格式按 UTC 解析(东八区显示差一天)。这篇就把这次"JS Date 的坑"的坑,从头到尾复盘一遍。

故障现场:6 月变 7 月、日期差一天

问题在于 Date 月份从 0 开始、字符串解析时区不一致:

// ✗ 坑一: Date 的月份从 0 开始(0=一月), 和"日"从1开始不一致
const d = new Date(2026, 6, 1);    // 想造 6月1日
console.log(d);                     // ✗ 2026-07-01! 6被当成第7个月(七月)!
// new Date(year, month, day): month 是 0-based(0=Jan, 6=Jul); day 是 1-based(正常);
//   → 想要6月, month要写 5; 想造6月1日: new Date(2026, 5, 1)。
console.log(new Date().getMonth()); // ✗ 比如5月返回4(0-based), 直接当月份显示就错一个月。

// ✗ 坑二: new Date(字符串) 解析的时区随格式而变
console.log(new Date("2026-06-02"));    // ISO纯日期: 按【UTC】解析 → UTC 2026-06-02 00:00:00Z
console.log(new Date("2026/06/02"));    // 斜杠格式: 按【本地时区】解析 → 本地 2026-06-02 00:00
// → "2026-06-02"(横线ISO date-only)是UTC; 在东八区(UTC+8):
//   它代表的时刻是 北京时间 06-02 08:00; 若取 .getDate() 没问题(还是2号),
//   但若把它和"本地0点的日期"比较、或某些库/转换处理, 容易差一天(显示成6月1日)。
// (规则细节: 带时间的ISO "2026-06-02T00:00:00" 按本地; 纯日期 "2026-06-02" 按UTC——极易混。)

// 还有更多 Date 的坑:
// - getDay() 是星期几(0=周日), getDate() 才是几号 → 名字易混;
// - Date 可变(setMonth等原地改), 易出意外;
// - 月末/闰年/setMonth溢出(setMonth(12)跳到下一年)等边界。

// 关键: JS Date 月份从0开始(6是七月, 和日/年不一致, 反直觉)、字符串解析时区随格式而变
//       (纯日期"YYYY-MM-DD"按UTC、斜杠按本地); 不懂这些隐含规则, 日期会凭空错位(差月/差天)。

第一次看到 new Date(2026, 6, 1) 打印出 7 月时,我又荒谬又无语:"年是 2026 没错、日是 1 没错,偏偏月份 6 给我变成了七月?谁能想到月份是从 0 数的、还偏偏只有月份这么反人类。"这个坑最坑的地方在于:极其反直觉且不一致——年、日都是正常的数,偏偏月份从 0 开始,让人防不胜防;而解析时区的坑更隐蔽——同样是日期字符串,横线和斜杠的时区假设竟然不同,差一天的 bug 只在跨时区/特定时刻才显形;它们都不报错,只是日期悄悄错了月/错了天下面就来拆解,JS Date 该怎么正确用。

第一件事:搞懂 JS Date 的反直觉规则

我顺着这次事故,把 JS Date 的那些坑彻底理清了。

JS Date 有哪些反直觉的坑?

【核心: 月份0-based(0=一月, 和日/年不一致)、字符串解析时区随格式变(纯日期按UTC)、可变、命名易混; 用现代库(dayjs/date-fns/Temporal)避开这些坑】

1. 月份从0开始(最坑):
   - new Date(year, month, day) 和 getMonth()/setMonth() 里的 month 是 0-11(0=一月, 11=十二月);
   - 而 day 是 1-31(1-based)、year正常 → 唯独月份从0, 极不一致、反直觉;
   - → 想要N月, 代码里写 N-1; 显示getMonth()时要+1; 极易差一个月。

2. 字符串解析的时区随格式而变:
   - new Date("2026-06-02") (ISO纯日期, 横线): 按 UTC 解析(UTC的0点);
   - new Date("2026-06-02T00:00:00") (ISO带时间, 无时区): 按 本地 解析;
   - new Date("2026/06/02") (斜杠): 按 本地 解析;
   - → 同样的"2026-06-02", 横线和斜杠/带不带时间, 时区假设不同 → 跨时区时差一天;
   - 还有: 非标准格式的解析行为因浏览器而异(不可靠)。

3. 其他坑:
   - getDay()=星期几(0=周日), getDate()=几号 → 名字像、易混;
   - getYear()已废弃(返回年-1900), 用getFullYear();
   - Date是可变的(setXxx原地修改), 多处引用易互相影响(同566引用问题);
   - setMonth(12)等会溢出进位到下一年(有时有用、有时是坑);
   - 月末/闰年加减的边界。

4. 根源: JS Date 是早期照搬Java旧Date设计的, 充满历史遗留的反直觉和不一致;
   - 它不是"现代、一致、好用"的日期API → 直接裸用极易踩坑。

5. 解药: 用现代日期库 或 Temporal
   - 库: day.js / date-fns / luxon —— API一致、月份从1(或明确)、时区处理清晰、不可变;
   - Temporal(JS新的日期时间API, 逐步可用): 设计现代、明确、不可变, 解决了Date的诸多坑;
   - 用库/Temporal 能避开月份从0、解析时区、可变等大部分坑。

一句话: JS Date月份从0开始(6是七月, 和日/年不一致)、字符串解析时区随格式变(纯日期按UTC)、可变、命名易混;
   这些历史遗留的反直觉规则极易让日期错位; 优先用现代库(dayjs/date-fns/Temporal)避开, 别裸用Date。

这套认知,是整个坑的根。月份从 0 开始(最坑):new Date(y, month, d) 和 getMonth()/setMonth() 的 month 是 0-11(0=一月),而 day 是 1-based、year 正常,唯独月份从 0、极不一致;想要 N 月写 N-1、显示 getMonth() 要 +1字符串解析的时区随格式变:"2026-06-02"(ISO 纯日期横线)按 UTC、"2026/06/02"(斜杠)和带时间的按本地,同样的日期跨时区差一天,非标准格式还因浏览器而异。其他坑:getDay(星期)vs getDate(几号)易混、Date 可变、setMonth 溢出进位、月末闰年边界。根源:JS Date 照搬 Java 旧 Date 设计,充满历史遗留的反直觉和不一致,裸用极易踩坑。解药:用现代日期库(dayjs/date-fns/luxon)或 Temporal(API 一致、时区清晰、不可变),避开月份从 0/解析时区/可变等坑。一句话:JS Date 月份从 0 开始(6 是七月,和日/年不一致)、字符串解析时区随格式变(纯日期按 UTC)、可变、命名易混;这些历史遗留的反直觉规则极易让日期错位;优先用现代库(dayjs/date-fns/Temporal)避开,别裸用 Date。

第二件事:正解——用现代日期库,或裸用 Date 时谨记月份-1、明确时区

搞懂了原理,正解就清晰了:优先用现代日期库(dayjs/date-fns/Temporal)避开 Date 的坑;不得不裸用 Date 时,谨记月份从 0(写 N-1)、明确解析格式和时区、注意可变性

// ====== 正解一: 用现代日期库(推荐) ======
import dayjs from "dayjs";

const d = dayjs("2026-06-02");        // ✓ 解析清晰、月份正常、不可变
console.log(d.month());                // dayjs的month还是0-based, 但API一致、有format
console.log(d.format("YYYY-MM-DD"));   // ✓ "2026-06-02" 不会错位
const next = d.add(1, "month");        // ✓ 不可变, 返回新对象; 加减清晰
// 时区: dayjs/luxon 有明确的时区插件, 解析/转换时区都显式可控。

// date-fns 也类似(纯函数、不可变、API清晰); Temporal(JS新API)更现代。

// ====== 正解二: 不得不裸用 Date 时的注意 ======
// 月份从0: 想要6月, month写 5; 显示getMonth()要 +1
const june1 = new Date(2026, 5, 1);    // ✓ 5 = 六月 → 2026-06-01
const monthForDisplay = new Date().getMonth() + 1;   // ✓ +1 才是给人看的月份

// 解析: 明确格式和时区, 别依赖隐含规则
// 想按本地解析date-only, 别用 new Date("2026-06-02")(按UTC), 用:
const localDate = new Date(2026, 5, 2);              // 直接用数字构造(本地)
// 或解析时明确处理时区(用库); 传输用带时区的ISO8601(2026-06-02T00:00:00+08:00)或时间戳。
# ====== 用日期的要点 ======
# 1. 优先用现代日期库(dayjs/date-fns/luxon)或Temporal: 避开Date的月份0、解析时区、可变等坑;
# 2. 裸用Date时谨记: 月份0-based(构造写N-1、显示getMonth()+1); getDate()才是几号、getDay()是星期;
# 3. 解析字符串明确时区: 别依赖"横线UTC、斜杠本地"的隐含规则; 用库, 或用数字构造, 或带时区的ISO8601;
# 4. 时间存储/传输统一(同572篇): 用UTC或带时区, 显示时按业务时区转; 别传裸的"本地日期字符串";
# 5. Date是可变的: setXxx会原地改, 注意别共享同一个Date对象被多处改(同566引用问题);
# 6. 边界: 月末/闰年/加减用库, 别自己算; setMonth溢出进位要留意。

# 核心: 优先用现代日期库/Temporal避开JS Date的坑(月份0、解析时区、可变); 裸用Date谨记月份-1、
#   明确解析的格式和时区、注意可变性; 日期看似简单实则坑多, 借成熟工具、别裸手硬刚。

修复的核心,是"优先用现代日期库,裸用 Date 谨记月份-1、明确时区"正解一:用现代日期库(推荐)——dayjs/date-fns/luxon/Temporal,解析清晰、API 一致、不可变、时区显式可控,避开月份从 0/解析时区/可变等坑正解二:不得不裸用 Date 时——月份从 0(想要 6 月 month 写 5、显示 getMonth()+1)、解析明确格式和时区(别用 new Date("2026-06-02") 按 UTC,用数字构造或库)要点:优先用库/Temporal、裸用谨记月份 0-based 和命名(getDate/getDay)、解析明确时区别依赖隐含规则、存储传输统一 UTC/带时区、注意 Date 可变、边界用库归根结底:优先用现代日期库/Temporal 避开 JS Date 的坑(月份 0、解析时区、可变);裸用 Date 谨记月份-1、明确解析的格式和时区、注意可变性;日期看似简单实则坑多,借成熟工具、别裸手硬刚。

第三件事:JS/编程中其他"反直觉、不一致的 API 设计"

排查后我把编程中其他容易踩的"反直觉、不一致的 API/规则"也系统梳理了一遍。

编程中其他反直觉、不一致的设计

# 1. JS Date月份从0(本文): 和日/年不一致。→ 用库/谨记-1。

# 2. JS的 typeof null === 'object': 历史bug, 反直觉。→ 记住特例。

# 3. 数组下标从0(普遍), 但有些场景从1: 跨语言/跨场景不一致。→ 留意上下文。

# 4. 字符串/数组的slice/substring/substr参数语义不同: 易混。→ 查清用哪个。

# 5. == 隐式转换(同567篇): 反直觉的相等。→ 用===。

# 6. 浮点 0.1+0.2≠0.3(同554篇): 反直觉。→ 用整数/Decimal。

# 7. 各语言"星期/月份/索引"起始值不一: 0还是1? → 查文档别想当然。

# 8. 时区/编码/单位等隐含约定(同572篇): 默认值因环境而异。→ 显式指定。

# 共同根源: 很多API/规则的设计, 因为历史遗留、跨语言习惯不一、或当初的取舍, 存在"反直觉、不一致"之处;
#   它们违背了我们"想当然"的预期(月份当然从1吧、相等当然就是相等吧); 而我们越是"想当然", 越容易在这些
#   "和直觉不符"的地方栽跟头——因为我们根本不会去怀疑、去查证它。

# 核心: 对API/规则别想当然(尤其是"起始值、边界、默认行为、隐含约定"这些易不一致的点); 用前查清它的
#   真实行为(读文档/测一下); 对历史遗留多坑的API(如JS Date)优先用更好的现代替代; 别凭直觉硬猜。

排查让我把其他反直觉、不一致的设计也梳理清了。一、JS Date 月份从 0(本文)。二、typeof null === 'object'三、数组下标从 0 但有些场景从 1四、slice/substring/substr 参数语义不同五、== 隐式转换六、浮点 0.1+0.2≠0.3七、各语言星期/月份/索引起始值不一八、时区/编码/单位的隐含约定它们的共同根源是:很多 API/规则的设计,因为历史遗留、跨语言习惯不一、或当初的取舍,存在"反直觉、不一致"之处;它们违背了我们"想当然"的预期(月份当然从 1 吧);而我们越是"想当然",越容易在这些和直觉不符的地方栽跟头——因为我们根本不会去怀疑、去查证它核心是:对 API/规则别想当然(尤其是"起始值、边界、默认行为、隐含约定"这些易不一致的点);用前查清它的真实行为(读文档/测一下);对历史遗留多坑的 API(如 JS Date)优先用更好的现代替代;别凭直觉硬猜下面这张图,是这次 JS Date 坑的成因与解法:

第四件事:JS Date 易错点对比表

这次踩坑后,我把 JS Date 的几个易错点整理成一张表。

你以为 实际 正确做法
new Date(2026, 6, 1) 是 6 月 是 7 月(月份 0-based) 6 月写 5,或用库
getMonth() 返回月份 返回 0-11(比月份小 1) 显示要 +1
getDay() 返回几号 返回星期几(0=周日) 几号用 getDate()
"2026-06-02" 按本地解析 纯日期按 UTC 解析 明确时区/用库/数字构造
Date 改了不影响别处 可变, setXxx 原地改 注意别共享、或用不可变库

这张表把易错点钉清了。核心是:JS Date 的坑,几乎全是"实际行为和'名字/直觉所暗示的'不一致"——名字叫 getMonth 你以为是月份(其实小 1)、叫 getDay 你以为是几号(其实是星期)、写 6 你以为是 6 月(其实七月);这些 API 的"命名/形式"和它"实际语义"之间,有一道道误导人的鸿沟它给我的最大启发是:一个设计糟糕的 API,最坑人的特征,就是"它的名字/形式, 误导你对它行为的预期"——getMonth 听起来该返回月份、却返回 0-based;这种"名不副实"让你凭名字想当然,而想当然恰恰错了;而好的 API 设计, 追求的正是"名实相符、符合直觉、最小惊讶(principle of least astonishment)"——让你"看到名字就能正确预期它的行为"这给了我一种使用和设计 API 的清醒:使用一个 API 时,别只凭"它的名字听起来该怎样"就想当然,要查清它"实际怎样"(尤其历史遗留的、知名有坑的);而自己设计 API/命名时,要努力做到"名实相符、符合直觉、最小惊讶"——让使用者"顾名思义"就不会用错,而不是埋下一个个"名字骗人"的坑;"不被 API 的名字误导、自己也设计名副其实的 API",是用好和写好接口的关键认清 JS Date 的坑源于名实不符、API 应名副其实符合直觉最小惊讶——是这个坑带给我的认知。

第五件事:这次事故暴露的"历史包袱"的代价

这次让我反思更深一层:JS Date 这么坑,是因为它当年照搬了 Java 的旧 Date 设计、背着历史包袱。我把"背历史包袱的旧设计"和"重新设计的现代方案"对比成表。

维度 JS Date(旧, 历史包袱) Temporal/现代库(重新设计)
月份 0-based(反直觉) 1-based / 明确
可变性 可变(易出意外) 不可变
时区 隐含、混乱 显式、清晰
为什么这样 照搬旧设计、要向后兼容 吸取教训、重新设计
能改吗 不能(会破坏现有代码)

这张表道出了 JS Date 之坑的来由。核心是:JS Date 之所以这么坑、又改不掉,是因为它背着沉重的"历史包袱"——它当年的设计有缺陷(照搬了 Java 的旧 Date),但因为已经被海量代码使用、改了就破坏向后兼容,所以这些坑只能一直保留;整个生态只能另起炉灶(出 Temporal、出各种库)来绕过它,而不能修它本身它给我的深刻启发是:"向后兼容"是一把双刃剑——它保护了现有的代码和投资(不破坏老的),但也把早期的设计错误"永久地冻结"了下来(想改也改不了);一个被广泛使用的接口/格式/协议, 它早期的设计决策(哪怕是错的), 会因为兼容性而长期、甚至永久地存在, 成为后来所有人都要背的包袱;"接口一旦被广泛依赖, 它的设计错误就很难再修正了"这给了我一种设计"会被广泛依赖的东西"时的敬畏:设计任何"会被很多人/很多代码长期依赖"的东西(公共 API、数据格式、协议、库的接口)时,要格外慎重地对待早期的设计决策——因为一旦它被广泛采用,这些决策(包括错误)就会因兼容性而很难再改、成为长期的包袱;"把它一开始就设计对"的价值, 远大于"先随便做、以后再改"(因为以后很可能改不动了);"对将被广泛依赖的设计慎之又慎、力求一开始就对",是一种对未来负责的远见——你今天的草率, 会成为无数后人长期的负担认清广泛依赖的接口设计错误会因兼容性永久冻结、对将被依赖的设计要慎重力求一开始就对——是这个 Date 坑带给我的认知。

第六件事:处理日期时间时,我现在的自检习惯

现在每当我要在 JS 里处理日期时间,我都会先按这张图问自己:

这张图的精髓,是"优先用现代日期库,裸用 Date 谨记月份-1、明确时区、注意命名"能用库用 dayjs/Temporal、裸用构造月份 N-1、解析明确时区别依赖隐含规则、跨时区统一 UTC这套习惯,让我从"裸用 Date 凭直觉"变成了"用库、或谨记 Date 的反直觉规则"——核心始终是:优先用现代日期库/Temporal 避开 JS Date 的坑,裸用 Date 谨记月份从 0(写 N-1)、明确解析的格式和时区、注意可变性和命名,别凭直觉硬猜。

我立下的几条规矩

这场"6 月变 7 月、日期差一天"的事故,换来了我处理 JS 日期时,刻进骨子里的几条铁律:

  1. JS Date 的月份是 0-based(0=一月,6=七月),和日/年不一致。想要 N 月写 N-1。
  2. getMonth() 返回 0-11(显示要 +1);getDate() 才是几号,getDay() 是星期。
  3. new Date("2026-06-02")(纯日期横线)按 UTC 解析,斜杠/带时间按本地。易差一天。
  4. 解析日期字符串别依赖隐含的时区规则,明确时区/用数字构造/用库。
  5. Date 是可变的(setXxx 原地改),注意别共享被多处改。
  6. 优先用现代日期库(dayjs/date-fns/luxon)或 Temporal,避开 Date 的一堆坑。
  7. 对 API 的起始值/默认行为别想当然,查清真实行为;别凭名字猜语义。

写在最后

回头看,这场由"JS Date 月份从 0、解析按 UTC"引发的、日期错月错天的事故,真正教给我的,远不止"用日期库、月份记得减一"这几个技巧。它让我对"我们对一个东西'应该怎样'的'常识/直觉', 在它的具体实现里未必成立; 而越是'天经地义'的直觉(比如'月份当然从 1 数'), 一旦被打破, 越让我们措手不及——因为我们根本不会去验证它",有了一次刻骨的体会。我栽跟头,是因为"月份从 1 开始数"对我来说是天经地义、不容置疑的常识——从小到大, 一月就是 1、六月就是 6, 这还用想吗?;于是我写 new Date(2026, 6, 1) 时, 那个 6 对我而言不言而喻就是六月, 我压根没有、也不可能想到去怀疑它;可 JS Date 偏偏用了一个和这个'常识'相悖的规则(月份从 0); 我那个最坚固、最不被怀疑的常识, 恰恰在这里失效了——而正因为它太'常识'、我从不设防, 它失效时, 我被错得莫名其妙、半天反应不过来这让我领悟到一个关于"常识的盲区"的深刻认知:我们脑中那些"最基础、最天经地义、从不怀疑的常识",恰恰是最危险的认知盲区——因为我们对它们毫无防备、从不验证,一旦某个具体系统/API/语境打破了这个常识,我们会因为"根本没想到它会不一样"而栽得最惨、查得最久;"越是理所当然的假设, 越少被审视, 也就越容易在它不成立的地方酿成隐蔽的错"这给了我一种排查与求证的根本谦逊:遇到"怎么也想不通、违反基本常识"的诡异现象时,要敢于把那些"最不可能错、最天经地义"的假设也拎出来验证一下——"月份真的是从 1 开始的吗?在这个具体的 API 里?";很多百思不得其解的 bug, 答案就藏在"一个你从未怀疑过的常识, 在这里其实不成立"里;"敢于审视和验证自己最根深蒂固的常识假设",是攻克违反直觉的诡异问题、突破认知盲区的关键认清最天经地义的常识是最危险的盲区、遇诡异问题要敢验证最不可能错的假设——这,是我用一次 JS Date 的事故,换来的、关于日期处理、也关于如何审视自己认知盲区的、最朴素也最深刻的领悟。如果这篇复盘,能让你下次用 JS Date 时,想起"月份从 0、解析看格式",或干脆换上 dayjs,那我对着那变成 7 月、又差一天的日期排查的这段时间,就值了。

—— 别看了 · 2026
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理 邮箱1846861578@qq.com。
技术教程

我在批处理循环里写了 try except pass,觉得出错就跳过别让程序崩很稳健,结果一批数据悄悄少处理了一半还谁都不知道,连 Ctrl+C 都按不停:一次裸 except 吞掉异常的深度复盘

2026-6-2 23:15:35

技术教程

我用一个 channel 收集多个 worker 的结果,某个 worker 干完顺手把 channel 关了,其他还在干活的 worker 一发送就 panic:send on closed channel,一次 Go channel 关闭所有权的深度复盘

2026-6-2 23:28:08

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索