山高月小,水落石出。

Goroutine Context 详细讲解

Go Context 详细讲解 context 是 Go 官方用来在 goroutine 之间传递取消信号、超时、截止时间和请求范围数据的标准库。它解决了并发编程中的核心问题:如何优雅地通知一组 goroutine 停止工作。 一、为什么需要 Context 1.1 没有 Context 的痛点 1 2 3 4 5 6 // 假设一个 HTTP 请求启动了 3 个 goroutine 处理子任务 func handler(w http.ResponseWriter, r *http.Request) { go fetchFromDB() // 用户断开连接,它还在跑 go callExternalAPI() // 超时了,它还在跑 go writeToCache() // 没人需要结果了,它还在跑 } 问题: 用户取消请求,goroutine 收不到通知,继续浪费资源 无法设置统一超时 无法在调用链中传递请求 ID、用户身份等数据 goroutine 泄漏 1.2 Context 的设计哲学 “一个请求,一棵 goroutine 树,一个 Context。” Context 是树形结构,根节点是 context.Background() 或 context.TODO() 父 Context 取消 → 所有子 Context 全部取消(级联) Context 是并发安全的,可被多个 goroutine 同时使用 Context 应该作为函数的第一个参数,命名为 ctx 二、Context 接口 1 2 3 4 5 6 7 8 9 10 11 12 13 type Context interface { // 返回 deadline 和是否设置了 deadline Deadline() (deadline time.Time, ok bool) // 返回一个 channel,在 Context 被取消时关闭 Done() <-chan struct{} // 返回取消原因(在 Done 关闭后才有意义) Err() error // 获取 key 对应的值 Value(key any) any } 关键点: ...

October 12, 2026 · 10 min · zwdart
山高月小,水落石出。

君子曰:学不可以已。

《荀子·劝学》 君子曰:学不可以已。 青,取之于蓝,而青于蓝;冰,水为之,而寒于水。木直中绳,輮以为轮,其曲中规。虽有槁暴,不复挺者,輮使之然也。故木受绳则直,金就砺则利,君子博学而日参省乎己,则知明而行无过矣。 吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。登高而招,臂非加长也,而见者远;顺风而呼,声非加疾也,而闻者彰。假舆马者,非利足也,而致千里;假舟楫者,非能水也,而绝江河。君子生非异也,善假于物也。 南方有鸟焉,名曰蒙鸠,以羽为巢,而编之以发,系之苇苕,风至苕折,卵破子死。巢非不完也,所系者然也。西方有木焉,名曰射干,茎长四寸,生于高山之上,而临百仞之渊,木茎非能长也,所立者然也。蓬生麻中,不扶而直;白沙在涅,与之俱黑。兰槐之根是为芷,其渐之滫,君子不近,庶人不服。其质非不美也,所渐者然也。故君子居必择乡,游必就士,所以防邪辟而近中正也。 物类之起,必有所始。荣辱之来,必象其德。肉腐出虫,鱼枯生蠹。怠慢忘身,祸灾乃作。强自取柱,柔自取束。邪秽在身,怨之所构。施薪若一,火就燥也;平地若一,水就湿也。草木畴生,禽兽群焉,物各从其类也。是故质的张而弓矢至焉,林木茂而斧斤至焉,树成荫而众鸟息焉,醯酸而蚋聚焉。故言有召祸也,行有招辱也,君子慎其所立乎! 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。是故无冥冥之志者,无昭昭之明;无惛惛之事者,无赫赫之功。行衢道者不至,事两君者不容。目不能两视而明,耳不能两听而聪。螣蛇无足而飞,鼫鼠五技而穷。《诗》曰:“尸鸠在桑,其子七兮。淑人君子,其仪一兮。其仪一兮,心如结兮。”故君子结于一也。 昔者瓠巴鼓瑟而流鱼出听,伯牙鼓琴而六马仰秣。故声无小而不闻,行无隐而不形。玉在山而草木润,渊生珠而崖不枯。为善不积邪?安有不闻者乎? 学恶乎始?恶乎终?曰:其数则始乎诵经,终乎读礼;其义则始乎为士,终乎为圣人。真积力久则入,学至乎没而后止也。故学数有终,若其义则不可须臾舍也。为之,人也;舍之,禽兽也。故书者,政事之纪也;诗者,中声之所止也;礼者,法之大分,类之纲纪也。故学至乎礼而止矣。夫是之谓道德之极。礼之敬文也,乐之中和也,诗书之博也,春秋之微也,在天地之间者毕矣。 君子之学也,入乎耳,箸乎心,布乎四体,形乎动静。端而言,蠕而动,一可以为法则。小人之学也,入乎耳,出乎口;口耳之间,则四寸耳,曷足以美七尺之躯哉!古之学者为己,今之学者为人。君子之学也,以美其身;小人之学也,以为禽犊。故不问而告谓之傲,问一而告二谓之囋。傲、非也,囋、非也;君子如向矣。 学莫便乎近其人。礼乐法而不说,诗书故而不切,春秋约而不速。方其人之习君子之说,则尊以遍矣,周于世矣。故曰:学莫便乎近其人。学之经莫速乎好其人,隆礼次之。上不能好其人,下不能隆礼,安特将学杂识志,顺诗书而已耳。则末世穷年,不免为陋儒而已。将原先王,本仁义,则礼正其经纬蹊径也。若挈裘领,诎五指而顿之,顺者不可胜数也。不道礼宪,以诗书为之,譬之犹以指测河也,以戈舂黍也,以锥餐壶也,不可以得之矣。故隆礼,虽未明,法士也;不隆礼,虽察辩,散儒也。 问楛者,勿告也;告楛者,勿问也;说楛者,勿听也。有争气者,勿与辩也。故必由其道至,然后接之;非其道则避之。故礼恭,而后可与言道之方;辞顺,而后可与言道之理;色从而后可与言道之致。故未可与言而言谓之傲,可与言而不言谓之隐,不观气色而言谓之瞽。故君子不傲、不隐、不瞽,谨顺其身。《诗》曰:“匪交匪舒,天子所予。”此之谓也。 百发失一,不足谓善射;千里蹞步不至,不足谓善御;伦类不通,仁义不一,不足谓善学。学也者,固学一之也。一出焉,一入焉,涂巷之人也;其善者少,不善者多,桀纣盗跖也;全之尽之,然后学者也。 君子知夫不全不粹之不足以为美也,故诵数以贯之,思索以通之,为其人以处之,除其害者以持养之。使目非是无欲见也,使耳非是无欲闻也,使口非是无欲言也,使心非是无欲虑也。及至其致好之也,目好之五色,耳好之五声,口好之五味,心利之有天下。是故权利不能倾也,群众不能移也,天下不能荡也。生乎由是,死乎由是,夫是之谓德操。德操然后能定,能定然后能应。能定能应,夫是之谓成人。天见其明,地见其光,君子贵其全也。 唐·颜真卿《劝学》 三更灯火五更鸡,正是男儿读书时。 黑发不知勤学早,白首方悔读书迟。 宋真宗《劝学诗》 富家不用买良田,书中自有千钟粟。 安居不用架高堂,书中自有黄金屋。 出门莫恨无人随,书中车马多如簇。 娶妻莫恨无良媒,书中自有颜如玉。 男儿欲遂平生志,五经勤向窗前读。

October 12, 2026 · 1 min · zwdart
山高月小,水落石出。

Goroutine Select

Go select 详解与可运行示例 一、本质:select 是什么 select 是 Go 里唯一的多路 channel 操作原语。它让一个 goroutine 同时等待多个 channel 操作,哪个先就绪就走哪个。没有它,你要么串行阻塞在单个 channel 上,要么自己开 goroutine 轮询。 一句话定位:switch 是对值的分支,select 是对通道就绪状态的分支。 1 2 3 4 5 6 7 8 9 10 select { case v := <-ch1: // ch1 有数据可读 handle(v) case ch2 <- x: // ch2 有接收者就绪 // 发送成功 case <-time.After(time.Second): // 超时 // ... default: // 所有 case 都没就绪 // 不阻塞,立即走这里 } 二、语法与语义规则 规则 1:case 必须是 channel 操作 合法:<-ch、ch <- v、v, ok := <-ch。 非法:普通表达式、函数调用(case f(): 不行)、常量比较。 ...

October 12, 2026 · 13 min · zwdart
山高月小,水落石出。

Goroutine Channel

Go Channel 详细讲解 Channel 是 Go 并发编程的核心,它是 goroutine 之间通信的管道,遵循 “不要通过共享内存来通信,而要通过通信来共享内存” 的设计哲学。 一、Channel 基础概念 1.1 什么是 Channel Channel 是一个类型化的管道,可以通过它发送和接收值: 1 2 3 ch := make(chan int) // 无缓冲 channel ch <- 42 // 发送 x := <-ch // 接收 1.2 创建方式 1 2 3 4 5 6 7 8 // 无缓冲 channel(同步) ch1 := make(chan int) // 有缓冲 channel(异步,容量为 3) ch2 := make(chan string, 3) // 声明(nil channel,无法使用,会永久阻塞) var ch3 chan int 1.3 三种操作 操作 语法 说明 发送 ch <- v 向 channel 写入 接收 v := <-ch 从 channel 读出 关闭 close(ch) 关闭 channel 二、无缓冲 vs 有缓冲 2.1 无缓冲 Channel(同步) 无缓冲 channel 的发送和接收必须同时准备好,否则阻塞。这叫"同步通信"。 ...

October 12, 2026 · 6 min · zwdart

基础知识 答题要点

针对基础知识科目(上午选择题),以下按模块列出高频考点,每条都标注了常考的具体形式和结论,方便直接背诵熟悉。 一、计算机组成与体系结构(约6分) 1. 码制与运算(必考) 补码的核心作用:将减法转化为加法,简化运算器设计;符号位与数值位统一处理。 浮点数:阶码决定范围,尾数决定精度。阶码越长范围越大,尾数越长精度越高。 2. 流水线技术(必考计算) 周期:取指令、分析、执行三段中最长的那段。 执行时间公式:建立时间 +(指令数 − 1)× 流水线周期。 3. 校验码(反复出现) 奇偶校验:只能检错,不能纠错。 CRC:可查错,不可纠错,用模2除法计算。 海明码:可查错也可纠错,校验位公式 2^r ≥ r + m + 1((m)为数据位,(r)为校验位)。 4. Cache与存储 Cache作用:缓解CPU与主存速度不匹配,依据局部性原理。 层次化存储:速度从高到低为 寄存器 → Cache → 主存 → 磁盘,容量相反。 二、操作系统(约6分) 1. 进程状态与PV操作(高频) 三态转换:运行→等待(等事件发生),等待→就绪(事件发生),就绪→运行(被调度)。 PV操作经典结论:互斥信号量初值为1;同步信号量初值通常为0。前趋图中,前驱节点执行V操作,后继节点执行P操作。 2. 死锁与银行家算法 死锁必要条件:互斥、请求与保持、不剥夺、环路等待。 银行家算法:判断系统是否处于安全状态,若存在安全序列则不会死锁。 3. 存储管理(必考计算) 页式存储地址转换:逻辑地址 = 页号 + 页内地址;通过页表将页号映射为物理块号。 页面置换:淘汰原则是“最近最久未使用”(LRU)或“先进先出”(FIFO),需判断是否发生缺页。 位示图:用二进制位表示磁盘块占用情况,考查字号、位号的计算。 4. 文件系统 绝对路径与相对路径:从根目录开始是绝对路径;从当前目录开始是相对路径。 索引文件:多级索引的地址项计算,常考直接地址、一级间接、二级间接的寻址范围。 三、数据结构与算法(约9分) 1. 树与二叉树(必考) 遍历:前序(根左右)、中序(左根右)、后序(左右根)。已知中序 + 前序(或后序)可唯一确定二叉树。 哈夫曼树:带权路径长度最小的二叉树,用于哈夫曼编码(频率高的编码短)。 二叉排序树:左子树 < 根 < 右子树,中序遍历得到有序序列。 2. 图(高频) ...

October 12, 2026 · 1 min · zwdart

应用技术科目 答题要点

针对应用技术科目(下午题),以下按题型列出高频考点,每条都标注了常考的具体形式和答题要点,方便直接背诵熟悉。 一、数据流图(DFD)—— 15分必拿题 1. 四大元素识别 外部实体:题干中的“用户”“管理员”“客户”“银行系统”等角色词,是系统边界之外的人或系统。 数据存储:题干中的“XX文件”“XX表”“XX库”“XX清单”等,命名以名词加“表/文件”后缀。 加工:用“动词+名词”命名(如“检查成绩表”“审定合格者”),不能只有输入没有输出。 数据流:用名词短语命名(如“工资数据”),不能用加工名(如“计算工资”)来命名数据流。 2. 数据平衡三原则(必考判断) 父图与子图平衡:子图的输入输出必须与父图中对应加工的输入输出完全一致。子图多出来的数据流,说明父图缺了。 加工自身平衡:每个加工必须有输入有输出。只有入没有出是“数据黑洞”,只有出没有入是“数据奇迹”。 顶层图与0层图平衡:顶层图的输入输出数量,0层图必须一一对应。 3. 补充数据流的步骤 先对比顶层图和0层图,圈出不匹配的地方。 再逐句阅读题干说明,标注实体和数据流去向。 检查加工与存储的交互:读数据时从存储出线,写数据时向存储入线。 4. 三条铁律(绝对违规) 数据存储之间不能直连,必须经过加工。 外部实体之间不能直连,必须经过加工。 加工不能只有入或只有出。 二、数据库设计 —— 15分必拿题 1. E-R图补全 联系类型判断:根据题干描述判断是1:1、1:n还是m:n。注意“一位客户可以预订多个客房,一间客房在不同时间也可被多人预订”→ 客户与客房之间是多对多。 联系属性补充:如果联系本身有属性(如“订单”有“订单内容”“日期”),要标在联系上。 2. E-R图转关系模式(必考规则) 1:1:将一方主键放入另一方作外键,或单独建表。 1:n:n端的主键放入1端作外键,或单独建表。 m:n:必须单独建一张关系表,主键为双方主键的组合,联系自身的属性也放入该表。 3. 关系模式填空(主键/外键判定) 找主键:从题干描述中找“唯一标识”的属性(如“员工号”“客房号”“身份证号”)。 找外键:如果关系A中记录了关系B的主键,该属性就是外键。 常考填空:(a)处填“供货商编号”或“团购点编号”等外键,(b)处填“客户电话”等参与联系的主键。 4. 范式判断(送分题) 1NF:属性不可再分。 2NF:消除非主属性对码的部分函数依赖。 3NF:消除非主属性对码的传递函数依赖。 三、UML建模 —— 15分必拿题 1. 类图(重中之重) 关系判定: 泛化(继承):空心三角实线,表示“is-a”,如 Customer 继承 Person。 聚合:空心菱形,表示“has-a”但整体与部分可分离。 组合:实心菱形,表示“has-a”且部分随整体销毁。 依赖:虚线箭头,一个类的变化影响另一个类。 多重度标注:1对1填“1”,1对多填“1..”或“0..”。注意“0”表示可以没有(如刚开业时没有订单)。 2. 用例图 包含(include):基础用例一定会执行被包含用例。 扩展(extend):基础用例可能执行扩展用例(有条件)。 泛化:参与者之间或用例之间的继承关系。 3. 时序图 关注对象之间的消息传递顺序,补全缺失的消息名称或对象生命线。 消息按时间顺序从上到下排列。 四、C语言算法设计 —— 15分必拿题 1. 四大算法策略识别(看题干) ...

October 12, 2026 · 1 min · zwdart

软考考点梳理

软考中级软件设计师的考点可以分成两大科目来梳理:基础知识(上午选择题)侧重知识广度,应用技术(下午主观题)侧重动手设计能力。以下按模块分类列出,并附上简要解释。 一、基础知识科目考点 这科涵盖面广,但单点深度适中,重在概念准确和知识面完整。 1. 计算机组成与体系结构 数据表示:原码、反码、补码、移码的转换与运算,浮点数的阶码与尾数含义(阶码决定范围,尾数决定精度)。 CPU与体系结构:CPU组成、指令系统、CISC与RISC的区别、流水线技术(吞吐率、加速比计算)。 存储系统:Cache的作用与命中率、层次化存储体系、主存编址计算。 校验码:奇偶校验、海明校验、CRC循环冗余校验的原理与检错纠错能力。 2. 操作系统 进程管理:进程状态转换、信号量与PV操作(常结合前趋图考查)、死锁的产生条件与银行家算法。 存储管理:页式存储、段页式存储的地址转换,页面置换算法(如LRU、FIFO),页面淘汰时的缺页判断。 文件管理:树形目录结构、索引文件结构、位示图的计算。 设备管理:磁盘调度算法(如SSTF、SCAN),I/O控制方式。 3. 数据结构与算法 这是软件的“立身之本”,既直接考选择题,也是下午算法题的基础。 线性结构:顺序表与链表的区别与操作,栈和队列的特性与应用场景。 树与二叉树:二叉树的性质与遍历(前/中/后序),二叉排序树、最优二叉树(哈夫曼树)、平衡二叉树的概念。 图:图的存储(邻接矩阵、邻接表),图的遍历(DFS/BFS),拓扑排序与关键路径。 查找与排序:二分查找、哈希查找(冲突处理),各类排序算法(快排、堆排、归并等)的时间/空间复杂度与稳定性。 算法策略:分治法、动态规划、贪心法、回溯法的基本思想与典型问题。 4. 程序设计语言基础 编译与解释:编译过程(词法、语法、语义分析等阶段),编译型与解释型语言的区别(效率与可移植性的权衡)。 语言机制:函数调用的参数传递方式(传值与传址),有限自动机与正规式(词法分析基础),表达式求值(后缀表达式)。 5. 软件工程 开发模型:瀑布模型、敏捷开发、螺旋模型等的特点与适用场景,常作为高频考点。 设计原则:模块的内聚与耦合(高内聚低耦合的具体类型),系统设计的基本原理。 测试与维护:黑盒测试(等价类、边界值)与白盒测试(逻辑覆盖),McCabe环路复杂度计算,软件维护的类型(纠错性、完善性等)。 6. 面向对象 核心概念:封装、继承、多态的含义与作用。 UML:类图、用例图、活动图、状态图等各类图的识别与语义。 设计模式:创建型、结构型、行为型模式的分类、意图与典型应用场景(如单例、工厂、观察者)。 7. 数据库系统 数据模型:E-R模型(实体、属性、联系)向关系模式的转换。 关系理论:函数依赖、键(主键/外键)、范式判定(1NF至3NF)、模式分解。 SQL与并发:基础SQL查询语句,事务的ACID特性,并发控制与封锁协议。 8. 计算机网络与信息安全 网络协议:OSI七层模型与TCP/IP协议族各层的功能与协议,子网划分与IP地址计算。 安全基础:对称与非对称加密、数字签名、信息摘要、数字证书,常见网络威胁与防范措施。 9. 知识产权与标准化 知识产权:软件著作权的保护对象、保护期限、归属判定与侵权认定。 标准化:标准的分类与代号,常见信息技术标准的基本知识。 10. 专业英语 英文阅读:正确阅读理解计算机领域的英文资料,通常为完形填空形式,考查专业术语理解与语境把握。 二、应用技术科目考点 这科是主观题,题型相对固定,重在把设计方法练成“肌肉记忆”。 1. 数据流图(必答) 绘制与补全:补充外部实体、数据存储、加工的名称,补全缺失的数据流。 数据平衡:确保顶层图与下层图的数据流守恒,父图与子图的输入输出对应。 2. 数据库设计(必答) E-R建模:根据需求描述补充实体、属性、联系,标出联系类型(1:1、1:n、m:n)。 关系模式转换:将E-R图转换为关系模式,指定主键与外键,判断范式级别。 3. UML建模(必答) 图例补全:根据场景描述补充用例图、类图、时序图、活动图或状态图中的缺失元素(如类名、关系、消息)。 4. C语言算法设计(必答) 代码填空:给定一段完整算法代码,挖去关键行,补全代码以符合算法逻辑。 算法策略:通常考查分治法、动态规划、贪心法、回溯法的实现细节,注重循环边界、变量初始化与状态转移方程。 5. 程序设计选答(Java / C++ 二选一) ...

October 12, 2026 · 1 min · zwdart
这里有一直迷路的小兔子

Goroutine详细:sync.WaitGroup

sync.WaitGroup 是什么. sync.WaitGroup 是 Go 标准库中用于等待一组 goroutine 完成的同步原语。它解决的核心问题是:主 goroutine 需要知道其他多个 goroutine 何时全部执行完毕。 基本用法 1 2 3 4 5 6 7 8 9 10 11 var wg sync.WaitGroup for i := 0; i < 3; i++ { wg.Add(1) // 计数 +1 go func(id int) { defer wg.Done() // 计数 -1 // 做一些工作 }(i) } wg.Wait() // 阻塞,直到计数归零 为什么需要 Add 和 Done WaitGroup 内部维护一个计数器,它的语义是"还有多少个任务没完成": ...

October 11, 2026 · 1 min · zwdart
这里有一直迷路的小兔子

Goroutine详细:并发编程详细讲解

Go 并发编程详细讲解 Go 的并发模型基于 CSP(Communicating Sequential Processes),核心思想是:不要通过共享内存来通信,而要通过通信来共享内存。 下面从基础到进阶,系统讲解 Go 并发的所有核心概念,每个概念都配上可运行的示例。 一、Goroutine:轻量级线程 1.1 基础用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 3; i++ { fmt.Println(s, i) time.Sleep(100 * time.Millisecond) } } func main() { go say("world") // 启动一个 goroutine say("hello") // 主 goroutine 继续执行 time.Sleep(500 * time.Millisecond) // 等 goroutine 跑完 } 关键点: ...

October 10, 2026 · 12 min · zwdart