[{"data":1,"prerenderedAt":4327},["ShallowReactive",2],{"search-docs":3,"doc-\u002Fgolang\u002Fadvanced\u002Fgo-concurrency":886},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,159,162,165,169,172,175,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,269,273,277,281,285,288,291,294,298,301,304,307,310,313,316,319,322,325,329,332,336,340,344,348,352,356,359,362,365,368,371,374,377,380,383,386,389,393,396,399,402,405,408,411,414,417,420,424,428,432,435,438,442,446,450,454,458,462,466,470,474,477,480,483,487,491,494,497,500,504,507,511,515,518,521,524,527,530,533,536,539,542,545,548,551,554,557,560,563,566,569,572,575,579,583,587,591,595,599,603,606,610,614,617,620,623,626,629,633,637,640,643,646,649,652,655,658,661,664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,716,720,724,728,732,736,740,744,748,752,756,760,764,768,772,775,779,783,787,790,793,796,799,802,805,808,811,814,818,822,825,829,832,835,838,841,844,848,851,854,858,862,865,869,873,876,879,882],{"path":5,"title":6,"description":7},"\u002Fabout\u002Fauthor","作者相关","只想纯粹的做一个程序员...",{"path":9,"title":10,"description":11},"\u002Fabout\u002Fjourney","心路历程","",{"path":13,"title":14,"description":15},"\u002Fai\u002Fagent\u002Fframeworks","Agent 框架","主流 Agent 框架：LangChain、LlamaIndex、AutoGen、CrewAI",{"path":17,"title":18,"description":19},"\u002Fai\u002Fagent\u002Fhooks","Agent Hooks 与自动化","Claude Agent 的 Hooks 生命周期、事件类型、典型自动化场景",{"path":21,"title":22,"description":23},"\u002Fai\u002Fagent\u002Fintroduction","AI Agent 概述","AI Agent 核心概念：感知、规划、执行、记忆",{"path":25,"title":26,"description":27},"\u002Fai\u002Fagent\u002Fpractice","Agent 实战","AI Agent 实战：构建自主任务执行系统",{"path":29,"title":30,"description":31},"\u002Fai\u002Fagent\u002Fsdk","Claude Agent SDK 开发","使用 Claude Agent SDK 构建自定义 AI Agent：架构、API、生命周期",{"path":33,"title":34,"description":35},"\u002Fai\u002Fagent\u002Fsubagents","Subagents 子代理","用 Subagents 分解复杂任务、并发执行、隔离上下文",{"path":37,"title":38,"description":39},"\u002Fai\u002Fagent\u002Ftool-use","工具调用","AI Agent 工具调用：Function Calling、Tool Use 原理与实践",{"path":41,"title":42,"description":43},"\u002Fai\u002Ffundamentals\u002Fdeep-learning","深度学习入门","深度学习基础知识：前向传播、反向传播、损失函数、优化器",{"path":45,"title":46,"description":47},"\u002Fai\u002Ffundamentals\u002Fml-basics","机器学习基础","机器学习核心概念：监督学习、无监督学习、强化学习",{"path":49,"title":50,"description":51},"\u002Fai\u002Ffundamentals\u002Fneural-networks","神经网络原理","神经网络架构：CNN、RNN、注意力机制",{"path":53,"title":54,"description":55},"\u002Fai\u002Fgetting-started","AI 学习路线","AI 技术学习路线图，从基础到实战的完整指南",{"path":57,"title":58,"description":59},"\u002Fai\u002Fllm\u002Ffine-tuning","模型微调","大模型微调技术：LoRA、QLoRA、全量微调、RLHF",{"path":61,"title":62,"description":63},"\u002Fai\u002Fllm\u002Fintroduction","大模型概述","大语言模型发展历程、核心能力与主流模型对比",{"path":65,"title":66,"description":67},"\u002Fai\u002Fllm\u002Flocal-deploy","本地部署","大模型本地部署：Ollama、vLLM、llama.cpp",{"path":69,"title":70,"description":71},"\u002Fai\u002Fllm\u002Ftransformer","Transformer 架构","Transformer 架构详解：自注意力机制、位置编码、多头注意力",{"path":73,"title":74,"description":75},"\u002Fai\u002Fmcp\u002Fclient","MCP Client 开发","MCP Client 开发指南：连接、调用、集成",{"path":77,"title":78,"description":79},"\u002Fai\u002Fmcp\u002Fdebugging","MCP 调试与排错","MCP Server 开发与集成过程中的常见问题、日志分析、诊断工具",{"path":81,"title":82,"description":83},"\u002Fai\u002Fmcp\u002Fintroduction","MCP 概述","Model Context Protocol 协议概述：架构、核心概念、应用场景",{"path":85,"title":86,"description":87},"\u002Fai\u002Fmcp\u002Fserver","MCP Server 开发","MCP Server 开发指南：资源、工具、提示词的实现",{"path":89,"title":90,"description":91},"\u002Fai\u002Fmcp\u002Ftools","MCP Tools 深入","深入理解 MCP Tools：与 Resources\u002FPrompts 的差异、Schema 设计、Annotations 与权限控制",{"path":93,"title":94,"description":95},"\u002Fai\u002Fprompt\u002Fadvanced","高级 Prompt 模式","高级 Prompt 设计模式：Tree-of-Thought、自我反思、多轮对话策略",{"path":97,"title":98,"description":99},"\u002Fai\u002Fprompt\u002Fbasics","Prompt 基础","Prompt Engineering 入门：基本概念、角色设定、输出格式控制",{"path":101,"title":102,"description":103},"\u002Fai\u002Fprompt\u002Ftechniques","提示词技巧","常用提示词技巧：Few-shot、Chain-of-Thought、ReAct",{"path":105,"title":106,"description":107},"\u002Fai\u002Frag\u002Fembedding","文本嵌入","文本嵌入模型：Embedding 原理、模型选择、相似度计算",{"path":109,"title":110,"description":111},"\u002Fai\u002Frag\u002Fintroduction","RAG 概述","检索增强生成（RAG）架构原理、优势与应用场景",{"path":113,"title":114,"description":115},"\u002Fai\u002Frag\u002Fpractice","RAG 实战","RAG 应用实战：文档问答系统、知识库搭建",{"path":117,"title":118,"description":119},"\u002Fai\u002Frag\u002Fvector-database","向量数据库","主流向量数据库对比：Milvus、Pinecone、Chroma、Weaviate",{"path":121,"title":122,"description":123},"\u002Fai\u002Fskills\u002Fbest-practices","Skill 最佳实践","编写高质量 Skill 的设计原则、常见陷阱与优化技巧",{"path":125,"title":126,"description":127},"\u002Fai\u002Fskills\u002Fcreating","创建自定义 Skill","从零编写一个可被 Agent 自动发现和调用的 Skill",{"path":129,"title":130,"description":131},"\u002Fai\u002Fskills\u002Fintroduction","Agent Skills 概述","Claude Agent Skills 概念、工作原理、与 Tools\u002FMCP 的区别",{"path":133,"title":134,"description":135},"\u002Fgolang\u002Fadvanced\u002Fconcurrency","Go - 并发深入","深入理解 Go 并发编程的核心机制。",{"path":137,"title":138,"description":139},"\u002Fgolang\u002Fadvanced\u002Fgc","Go - 垃圾回收","理解 Go 的垃圾回收机制，掌握 GC 调优方法。",{"path":141,"title":142,"description":143},"\u002Fgolang\u002Fadvanced\u002Fgmp","Go - GMP 调度模型","GMP 是 Go 运行时调度器的核心模型，理解它对于编写高性能 Go 程序至关重要。",{"path":145,"title":146,"description":147},"\u002Fgolang\u002Fadvanced\u002Fgo-concurrency","Go - 并发编程","Go 的并发是其核心特性之一，通过 Goroutine 和 Channel 实现。",{"path":149,"title":150,"description":151},"\u002Fgolang\u002Fadvanced\u002Fmemory","Go - 内存模型","理解 Go 的内存分配机制和内存模型。",{"path":153,"title":154,"description":155},"\u002Fgolang\u002Fadvanced\u002Fprofiling","Go - 性能分析","掌握 Go 的性能分析工具：pprof、trace、benchmark。",{"path":157,"title":158,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-basic","Go - 基础语法",{"path":160,"title":161,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-composite","Go - 复合类型",{"path":163,"title":164,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-control","Go - 流程控制",{"path":166,"title":167,"description":168},"\u002Fgolang\u002Fcore\u002Fgo-error","Go - 错误处理","Go 使用显式的错误返回值来处理错误，而不是异常机制。",{"path":170,"title":171,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-function","Go - 函数",{"path":173,"title":174,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-install","Go - 环境搭建",{"path":176,"title":177,"description":11},"\u002Fgolang\u002Fcore\u002Fgo-interface","Go - 接口",{"path":179,"title":180,"description":181},"\u002Fgolang\u002Fcore\u002Fgo-module","Go - 包管理","Go Modules 是 Go 1.11 引入的官方依赖管理方案，Go 1.16 后成为默认模式。",{"path":183,"title":184,"description":185},"\u002Fgolang\u002Fdistributed\u002Fgrpc","Go - gRPC","gRPC 是 Google 开发的高性能 RPC 框架，使用 Protocol Buffers 作为序列化协议。",{"path":187,"title":188,"description":189},"\u002Fgolang\u002Fdistributed\u002Fmicroservice","Go - 微服务","微服务架构的核心组件：服务发现、负载均衡、熔断降级。",{"path":191,"title":192,"description":193},"\u002Fgolang\u002Fdistributed\u002Fmq","Go - 消息队列","使用 Go 操作 Kafka 和 RabbitMQ。",{"path":195,"title":196,"description":197},"\u002Fgolang\u002Fdistributed\u002Fredis","Go - Redis","使用 go-redis 操作 Redis，实现缓存、分布式锁等功能。",{"path":199,"title":200,"description":201},"\u002Fgolang\u002Fengineering\u002Fconfig","Go - 配置管理","使用 viper 进行配置管理，支持多种配置格式和配置中心。",{"path":203,"title":204,"description":205},"\u002Fgolang\u002Fengineering\u002Fdocker","Go - Docker 部署","使用 Docker 容器化部署 Go 应用。",{"path":207,"title":208,"description":209},"\u002Fgolang\u002Fengineering\u002Fkubernetes","Go - Kubernetes 部署","在 Kubernetes 上部署和管理 Go 应用。",{"path":211,"title":212,"description":213},"\u002Fgolang\u002Fengineering\u002Flogging","Go - 日志系统","使用 zap 和 logrus 构建高性能结构化日志系统。",{"path":215,"title":216,"description":217},"\u002Fgolang\u002Fengineering\u002Ftesting","Go - 单元测试","Go 内置了强大的测试框架，掌握测试是编写高质量代码的基础。",{"path":219,"title":220,"description":221},"\u002Fgolang\u002Fstdlib\u002Fbufio","bufio","在 Go 语言中，bufio 包提供了带缓冲的 I\u002FO 操作，能够提高读写性能。以下是一些常用的 bufio 包 API 及其详细说明：",{"path":223,"title":224,"description":225},"\u002Fgolang\u002Fstdlib\u002Fcontainer","container","在Go语言标准库中，container 包提供了几种常用的数据结构实现，这些数据结构对于高效地管理和操作数据非常有用。以下是 container 包中主要的数据结构：",{"path":227,"title":228,"description":229},"\u002Fgolang\u002Fstdlib\u002Fcrypto","crypto","在 Go 语言中，crypto 包提供了一组用于加密和解密的功能。以下是一些常用的 crypto 包及其子包的 API 及其详细说明：",{"path":231,"title":232,"description":233},"\u002Fgolang\u002Fstdlib\u002Fencoding-csv","encoding\u002Fcsv","在 Go 语言中，encoding\u002Fcsv 包提供了对 CSV（逗号分隔值）文件进行读写的功能。以下是一些常用的 encoding\u002Fcsv 包的 API 及其详细说明：",{"path":235,"title":236,"description":237},"\u002Fgolang\u002Fstdlib\u002Fencoding-json","encoding\u002Fjson","在 Go 语言中，encoding\u002Fjson 包提供了对 JSON 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fjson 包的 API 及其详细说明：",{"path":239,"title":240,"description":241},"\u002Fgolang\u002Fstdlib\u002Fencoding-xml","encoding\u002Fxml","在 Go 语言中，encoding\u002Fxml 包提供了对 XML 数据进行编码和解码的功能。以下是一些常用的 encoding\u002Fxml 包的 API 及其详细说明：",{"path":243,"title":244,"description":245},"\u002Fgolang\u002Fstdlib\u002Fflag","flag","在Go语言中，flag 包是用于处理命令行参数的标准库，它提供了一种简单而直接的方式来解析和使用命令行参数。下面是关于 flag 包的一些基本介绍和常用功能：",{"path":247,"title":248,"description":249},"\u002Fgolang\u002Fstdlib\u002Ffmt","fmt","在 Go 语言的标准库中，fmt 包是非常重要的，它提供了处理格式化输入和输出的基本工具。以下是一些 fmt 包内常用的API：",{"path":251,"title":252,"description":253},"\u002Fgolang\u002Fstdlib\u002Fhttp","net\u002Fhttp","在 Go 语言中，net\u002Fhttp 包提供了用于构建 HTTP 客户端和服务器的强大工具。以下是一些常用的 net\u002Fhttp 包的 API 及其详细说明：",{"path":255,"title":256,"description":257},"\u002Fgolang\u002Fstdlib\u002Fio","io","在 Go 语言中，io 包提供了基本的输入输出功能。以下是一些常用的 io 包的 API 及其详细说明：",{"path":259,"title":260,"description":261},"\u002Fgolang\u002Fstdlib\u002Flog","log","在 Go 语言中，log 包提供了简单的日志记录功能。以下是一些常用的 log 包的 API 及其详细说明：",{"path":263,"title":264,"description":265},"\u002Fgolang\u002Fstdlib\u002Fmath","math","在 Go 语言中，math 包提供了基本的数学函数和常量。以下是一些常用的 math 包的 API 及其详细说明：",{"path":267,"title":268,"description":11},"\u002Fgolang\u002Fstdlib\u002Fnet","net",{"path":270,"title":271,"description":272},"\u002Fgolang\u002Fstdlib\u002Fos","os","在Go语言中，os 包是一个非常重要且常用的标准库，它提供了与操作系统交互的功能，包括文件操作、环境变量管理、进程管理等。下面是一些 os 包中常用的功能和API：",{"path":274,"title":275,"description":276},"\u002Fgolang\u002Fstdlib\u002Fsort","order","在 Go 语言中，sort 包提供了对切片和用户定义的集合进行排序的函数。它实现了常见的排序算法，如快速排序（Quicksort）和堆排序（Heapsort），并且为自定义集合提供了接口，使得用户可以根据特定的需求进行排序。",{"path":278,"title":279,"description":280},"\u002Fgolang\u002Fstdlib\u002Fstrconv","strconv","在 Go 语言中，strconv 包提供了字符串和基本数据类型之间的转换函数，例如将整数转换为字符串、字符串转换为整数，以及其他类型之间的转换。这些功能非常有用，特别是在处理用户输入或从外部数据源读取数据时。",{"path":282,"title":283,"description":284},"\u002Fgolang\u002Fstdlib\u002Ftime","time","在 Go 语言中，time 包提供了处理时间和日期的功能。以下是一些常用的 time 包的 API 及其详细说明：",{"path":286,"title":287,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ferror","Gin - 错误处理",{"path":289,"title":290,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Ffile","Gin - 文件处理",{"path":292,"title":293,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fmiddleware","Gin - 中间件",{"path":295,"title":296,"description":297},"\u002Fgolang\u002Fweb\u002Fgin\u002Fquickstart","Gin - 快速开始","Gin 是目前最流行的 Go Web 框架，以高性能和简洁 API 著称。",{"path":299,"title":300,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frequest","Gin - 请求处理",{"path":302,"title":303,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fresponse","Gin - 响应处理",{"path":305,"title":306,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Frouter","Gin - 路由",{"path":308,"title":309,"description":11},"\u002Fgolang\u002Fweb\u002Fgin\u002Fvalidation","Gin - 参数校验",{"path":311,"title":312,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fassociation","GORM - 关联关系",{"path":314,"title":315,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fcrud","GORM - CRUD 操作",{"path":317,"title":318,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fmodel","GORM - 模型定义",{"path":320,"title":321,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fperformance","GORM - 日志与性能",{"path":323,"title":324,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquery","GORM - 高级查询",{"path":326,"title":327,"description":328},"\u002Fgolang\u002Fweb\u002Fgorm\u002Fquickstart","GORM - 快速开始","GORM 是 Go 语言最流行的 ORM 库，功能强大，使用简单。",{"path":330,"title":331,"description":11},"\u002Fgolang\u002Fweb\u002Fgorm\u002Ftransaction","GORM - 事务与 Hook",{"path":333,"title":334,"description":335},"\u002Finterview\u002Fbasic","计算机基础面经","本章节汇总了面试中常见的通用技术概念，不局限于特定语言或数据库，是考察技术内功的关键考点。",{"path":337,"title":338,"description":339},"\u002Finterview\u002Fgolang","Golang 面试题","Go 语言面试高频考点，覆盖基础语法、数据结构、并发编程、内存管理、GC、调度器等核心知识。",{"path":341,"title":342,"description":343},"\u002Finterview\u002Fk8s","Kubernetes 面试题","Kubernetes（K8s）面试高频考点，覆盖架构原理、核心资源、网络存储、调度策略、运维监控等核心知识。",{"path":345,"title":346,"description":347},"\u002Finterview\u002Fmysql","MySQL 面试题","MySQL 数据库面试高频考点，覆盖索引、事务、锁、优化、主从复制等核心知识。",{"path":349,"title":350,"description":351},"\u002Finterview\u002Fredis","Redis 面试题","Redis 面试高频考点，覆盖数据结构、持久化、集群、缓存一致性、性能优化等核心知识。",{"path":353,"title":354,"description":355},"\u002Finterview\u002Frocketmq","RocketMQ 面试题","RocketMQ 面试高频考点，覆盖消息模型、可靠性、顺序消息、事务消息、存储与高可用等核心知识。",{"path":357,"title":358,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-arraylist","List - ArrayList 源码解析",{"path":360,"title":361,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-linkedlist","List - LinkedList 源码解析",{"path":363,"title":364,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-stack","List - Satck源码解析",{"path":366,"title":367,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Flist-vectore","List - Vector 源码解析",{"path":369,"title":370,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-hashmap","Map - HashMap 源码解析",{"path":372,"title":373,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-linkedhashmap","Map - LinkedHashMap 源码解析",{"path":375,"title":376,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fmap-treemap","Map - TreeMap 源码解析",{"path":378,"title":379,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-deque","Queue - Deque 接口解析",{"path":381,"title":382,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fqueue-queue","Queue - Queue 接口解析",{"path":384,"title":385,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-hashset","Set - HashSet源码解析",{"path":387,"title":388,"description":11},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-linkedhashset","Set - LinkedHashSet 源码解析",{"path":390,"title":391,"description":392},"\u002Fother\u002Fjava\u002Fcollection\u002Fset-treeset","Set - TreeSet源码解析","TreeSet 是一个 Set 集合接口的实现类，与 HashSet 类似，其底层也是通过维护了一个 TreeMap 对象来封装了一些实现方法，故本篇不再对 TreeSet 的底层原理进行详细说明，仅对常用 API 做简单介绍，如需了解 TreeMap 的底层实现原理，请移步 Map - HashMap 源码解析",{"path":394,"title":395,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fannotation","Java核心 - 注解",{"path":397,"title":398,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fbasic-grammar","Java核心 - 基础语法",{"path":400,"title":401,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fclass-and-object","Java核心 - 面向对象",{"path":403,"title":404,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fcommon-classes","Java核心 - 常用类",{"path":406,"title":407,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fexception","Java核心 - 异常处理",{"path":409,"title":410,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fgenerics","Java核心 - 泛型",{"path":412,"title":413,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fjdk-env-path","Java核心 - 环境搭建",{"path":415,"title":416,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Freflection","Java核心 - 反射",{"path":418,"title":419,"description":11},"\u002Fother\u002Fjava\u002Fcore\u002Fstring","Java核心 - String 字符串",{"path":421,"title":422,"description":423},"\u002Fother\u002Fjava\u002Fio\u002Fbuffer-stream","Java IO - 缓冲流","缓冲流是对基本流的包装，通过内置缓冲区减少系统调用次数，大幅提升读写效率。",{"path":425,"title":426,"description":427},"\u002Fother\u002Fjava\u002Fio\u002Fbyte-stream","Java IO - 字节流","字节流是 Java IO 中最基本的流类型，以字节（byte）为单位进行数据读写，可以处理任意类型的文件。",{"path":429,"title":430,"description":431},"\u002Fother\u002Fjava\u002Fio\u002Fchar-stream","Java IO - 字符流","字符流以字符为单位进行读写，专门用于处理文本文件。相比字节流，字符流能够正确处理字符编码，避免中文乱码问题。",{"path":433,"title":434,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Ffile","Java IO - File 类",{"path":436,"title":437,"description":11},"\u002Fother\u002Fjava\u002Fio\u002Fio-stream-system","Java IO - IO流概述",{"path":439,"title":440,"description":441},"\u002Fother\u002Fjava\u002Fio\u002Fnio","Java IO - NIO","NIO（New IO）是 JDK 1.4 引入的新 IO 模型，提供了更高效的 IO 操作方式，支持非阻塞 IO 和多路复用。",{"path":443,"title":444,"description":445},"\u002Fother\u002Fjava\u002Fjvm\u002Fclass-loading","类加载机制","类加载机制是 JVM 将 .class 文件加载到内存，并对数据进行校验、转换解析和初始化，最终形成可被 JVM 直接使用的 Java 类型的过程。",{"path":447,"title":448,"description":449},"\u002Fother\u002Fjava\u002Fjvm\u002Fgarbage-collection","垃圾回收","垃圾回收（Garbage Collection，GC）是 JVM 自动管理内存的机制，负责回收不再使用的对象所占用的内存。",{"path":451,"title":452,"description":453},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-memory","JVM 内存结构","JVM 在执行 Java 程序时，会把它管理的内存划分为若干个不同的数据区域。这些区域有各自的用途、创建和销毁时间。",{"path":455,"title":456,"description":457},"\u002Fother\u002Fjava\u002Fjvm\u002Fjvm-tuning","JVM 调优","JVM 调优是优化 Java 应用性能的重要手段，主要包括参数配置、性能监控和问题排查。",{"path":459,"title":460,"description":461},"\u002Fother\u002Fjava\u002Fthread\u002Fatomic","原子类","Java 原子类（Atomic Classes）提供了一种无锁的线程安全方式，基于 CAS（Compare-And-Swap）操作实现。",{"path":463,"title":464,"description":465},"\u002Fother\u002Fjava\u002Fthread\u002Fcompletable-future","CompletableFuture","CompletableFuture 是 JDK 8 引入的异步编程工具，实现了 Future 和 CompletionStage 接口，支持函数式编程和链式调用。",{"path":467,"title":468,"description":469},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-collections","并发集合","Java 并发包提供了多种线程安全的集合类，用于替代传统的同步集合（如 Collections.synchronizedList）。",{"path":471,"title":472,"description":473},"\u002Fother\u002Fjava\u002Fthread\u002Fconcurrent-utils","并发工具类","Java 并发包提供了多种实用的并发工具类，用于控制线程之间的协调与同步。",{"path":475,"title":476,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fsynchronized-lock","同步机制",{"path":478,"title":479,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-basic","线程基础",{"path":481,"title":482,"description":11},"\u002Fother\u002Fjava\u002Fthread\u002Fthread-pool","线程池",{"path":484,"title":485,"description":486},"\u002Fother\u002Fspring-series\u002Fspring\u002Fannotations-beans","Spring - 基于注解管理Bean","从 Java 5 开始，Java 增加了对注解（Annotation）的支持，它是代码中的一种特殊标记，可以在编译、类加载和运行时被读取，执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下，在源代码中嵌入补充信息。",{"path":488,"title":489,"description":490},"\u002Fother\u002Fspring-series\u002Fspring\u002Fimplement-ioc","Spring - 原理手写IoC","Spring 框架的 IOC 是基于 Java 反射机制实现的，在学习手写 IoC 之前，你需要具备一定的 Java 反射相关的知识，参考本站内的 Java 教程。",{"path":492,"title":493,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fintroduction-case","Spring - 入门案例",{"path":495,"title":496,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aop","Spring - 面向切面AOP",{"path":498,"title":499,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-aot","Spring - AOT提前编译",{"path":501,"title":502,"description":503},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-data-validation","Spring - 数据校验","在开发中，我们经常遇到参数校验的需求，比如用户注册的时候，要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式，我们会把校验的代码和真正的业务处理逻辑耦合在一起，而且如果未来要新增一种校验逻辑也需要在修改多个地方。而spring validation允许通过注解的方式来定义对象校验规则，把校验和业务逻辑分离开，让代码编写更加方便。Spring Validation其实就是对Hibernate Validator进一步的封装，方便在Spring中使用。",{"path":505,"title":506,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-i18n","Spring - 国际化i18n",{"path":508,"title":509,"description":510},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-ioc","Spring - IOC容器","IoC 是 Inversion of Control 的简写，译为“控制反转”，它不是一门技术，而是一种设计思想，是一个重要的面向对象编程法则，能够指导我们如何设计出松耦合、更优良的程序。",{"path":512,"title":513,"description":514},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-junit","Spring - 单元测试JUnit","在之前的测试方法中，几乎都能看到以下的两行代码：",{"path":516,"title":517,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-resources","Spring - 资源操作",{"path":519,"title":520,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-summarize","Spring - Spring概述",{"path":522,"title":523,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fspring-transaction","Spring - 事务",{"path":525,"title":526,"description":11},"\u002Fother\u002Fspring-series\u002Fspring\u002Fxml-beans","Spring - 基于XML管理Bean",{"path":528,"title":529,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-config","SpringBoot - 配置详解",{"path":531,"title":532,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-data","SpringBoot - 数据访问",{"path":534,"title":535,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-quickstart","SpringBoot - 快速入门",{"path":537,"title":538,"description":11},"\u002Fother\u002Fspring-series\u002Fspringboot\u002Fspringboot-web","SpringBoot - Web 开发",{"path":540,"title":541,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-config","SpringCloud - 配置中心",{"path":543,"title":544,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-discovery","SpringCloud - 服务注册与发现",{"path":546,"title":547,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-feign","SpringCloud - 服务调用",{"path":549,"title":550,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-gateway","SpringCloud - 服务网关",{"path":552,"title":553,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-introduction","SpringCloud - 微服务概述",{"path":555,"title":556,"description":11},"\u002Fother\u002Fspring-series\u002Fspringcloud\u002Fspringcloud-sentinel","SpringCloud - 服务保护",{"path":558,"title":559,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-databind","SpringMVC - 数据绑定与转换",{"path":561,"title":562,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-exception","SpringMVC - 异常处理",{"path":564,"title":565,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-interceptor","SpringMVC - 拦截器",{"path":567,"title":568,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-introduction","SpringMVC - 简介与环境搭建",{"path":570,"title":571,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-request","SpringMVC - 请求处理",{"path":573,"title":574,"description":11},"\u002Fother\u002Fspring-series\u002Fspringmvc\u002Fspringmvc-response","SpringMVC - 响应处理",{"path":576,"title":577,"description":578},"\u002Fproject\u002Frocket-leaf\u002Farchitecture","项目架构","Rocket-Leaf 的目录结构、模块划分、数据流向，以及各层之间的依赖关系。",{"path":580,"title":581,"description":582},"\u002Fproject\u002Frocket-leaf\u002Fbackend-layers","后端分层设计","Rocket-Leaf 的 model \u002F rocketmq \u002F service 三层结构，以及服务之间的依赖关系与设计取舍。",{"path":584,"title":585,"description":586},"\u002Fproject\u002Frocket-leaf\u002Fclient-manager","RocketMQ 客户端管理器","AdminClientManager 的多客户端池、默认连接懒加载、自动重连重试的设计与实现。",{"path":588,"title":589,"description":590},"\u002Fproject\u002Frocket-leaf\u002Fencryption","连接信息加密存储","AES-256-GCM + SHA-256 字段级派生密钥的实现，以及如何在不破坏兼容性的前提下为历史明文数据做透明迁移。",{"path":592,"title":593,"description":594},"\u002Fproject\u002Frocket-leaf\u002Ffrontend","前端结构与类型绑定","React + Vite 目录组织、自动生成的 Wails 绑定、api 薄封装与自定义 hooks 的职责划分。",{"path":596,"title":597,"description":598},"\u002Fproject\u002Frocket-leaf","项目简介","Rocket-Leaf 是一款基于 Wails v3 构建的跨平台 RocketMQ 桌面管理客户端，Go 后端 + React 前端。本文档系列拆解它的架构与关键实现。",{"path":600,"title":601,"description":602},"\u002Fproject\u002Frocket-leaf\u002Fwails-v3","Wails v3 入门","Wails v3 的核心概念、Service 绑定机制，以及 Rocket-Leaf 是如何用它把 Go 后端和 React 前端打通的。",{"path":604,"title":605,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-basic","Docker - 入门基础",{"path":607,"title":608,"description":609},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-compose","Docker - Compose","在部署应用时，常常使用到不止一个容器，那么在部署容器的时候就需要一个一个进行部署，这样的部署过程也相对来说比较繁琐复杂，也容易出问题，那么有没有一种更为简单的方法呢？",{"path":611,"title":612,"description":613},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-container-connection","Docker - 容器互联","在上一个章节中我们学习了 Docker 容器的端口映射，可以将 Docker 容器和本地以及网络中的端口进行连接起来。",{"path":615,"title":616,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-dockerfile","Docker - Dockerfile",{"path":618,"title":619,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-helloworld","Docker - HelloWorld",{"path":621,"title":622,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-install","Docker - 安装",{"path":624,"title":625,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-introduce","Docker - 简介",{"path":627,"title":628,"description":11},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-object","Docker - 镜像、容器、仓库",{"path":630,"title":631,"description":632},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-warehouse","Docker - 仓库管理","仓库是集中存放资源的地方，代码仓库是存放代码的，那么Docker 中的仓库就是存放 Docker 镜像的。",{"path":634,"title":635,"description":636},"\u002Ftutorials\u002Fcloud\u002Fdocker\u002Fdocker-web-containers","Docker - WEB应用实例","在之前的章节中，仅对普通容器进行了演示，但在实际中常常使用到 Docker 容器中的 WEB 应用程序。",{"path":638,"title":639,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-config","Kubernetes - ConfigMap 与 Secret",{"path":641,"title":642,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-helm","Kubernetes - Helm 包管理",{"path":644,"title":645,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-install","Kubernetes - 集群安装",{"path":647,"title":648,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-introduction","Kubernetes - 简介与架构",{"path":650,"title":651,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-kubectl","Kubernetes - kubectl 命令行工具",{"path":653,"title":654,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-monitoring","Kubernetes - 监控与日志",{"path":656,"title":657,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-network-security","Kubernetes - 网络与安全",{"path":659,"title":660,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-service","Kubernetes - Service 与 Ingress",{"path":662,"title":663,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-storage","Kubernetes - 持久化存储",{"path":665,"title":666,"description":11},"\u002Ftutorials\u002Fcloud\u002Fkubernetes\u002Fk8s-workload","Kubernetes - 工作负载资源",{"path":668,"title":669,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-bash","Linux - Bash 基础语法",{"path":671,"title":672,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-file-directory","Linux - 文件与目录操作",{"path":674,"title":675,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-network","Linux - 网络配置",{"path":677,"title":678,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-package","Linux - 软件包管理",{"path":680,"title":681,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-process","Linux - 进程管理",{"path":683,"title":684,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-scripts","Linux - 常用脚本示例",{"path":686,"title":687,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-service","Linux - 服务管理",{"path":689,"title":690,"description":11},"\u002Ftutorials\u002Fcloud\u002Flinux\u002Flinux-user-permission","Linux - 用户与权限管理",{"path":692,"title":693,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-https","Nginx - HTTPS 配置",{"path":695,"title":696,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-install","Nginx - 安装与配置",{"path":698,"title":699,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-loadbalance","Nginx - 负载均衡",{"path":701,"title":702,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-optimization","Nginx - 性能优化",{"path":704,"title":705,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-proxy","Nginx - 反向代理",{"path":707,"title":708,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-static","Nginx - 静态资源服务",{"path":710,"title":711,"description":11},"\u002Ftutorials\u002Fcloud\u002Fnginx\u002Fnginx-vhost","Nginx - 虚拟主机配置",{"path":713,"title":714,"description":715},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-architecture","MySQL 高可用架构","主从复制、读写分离、分库分表。",{"path":717,"title":718,"description":719},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-index","MySQL 索引","索引是帮助 MySQL 高效获取数据的有序数据结构。",{"path":721,"title":722,"description":723},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-lock","MySQL 锁","锁用于解决并发访问时的数据一致性问题。",{"path":725,"title":726,"description":727},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-optimize","MySQL 性能优化","SQL 优化是后端开发必备技能。",{"path":729,"title":730,"description":731},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fmysql-transaction","MySQL 事务","事务是一组不可分割的操作，要么全部成功，要么全部失败。",{"path":733,"title":734,"description":735},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-advanced","SQL 进阶","多表查询、子查询、函数、视图、存储过程。",{"path":737,"title":738,"description":739},"\u002Ftutorials\u002Fdatabase\u002Fmysql\u002Fsql-basic","SQL 基础","SQL（Structured Query Language）是操作关系型数据库的标准语言。",{"path":741,"title":742,"description":743},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-advanced","Redis 进阶功能","事务、发布订阅、Lua 脚本、Pipeline。",{"path":745,"title":746,"description":747},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-basic","Redis 基础","Redis 安装配置与基本命令。",{"path":749,"title":750,"description":751},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-cluster","Redis 高可用","主从复制、哨兵、Cluster 集群。",{"path":753,"title":754,"description":755},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-datatype","Redis 数据类型","Redis 5 种基本数据类型 + 4 种特殊类型。",{"path":757,"title":758,"description":759},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-optimize","Redis 性能优化","内存优化、缓存问题、最佳实践。",{"path":761,"title":762,"description":763},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-persistence","Redis 持久化","Redis 提供 RDB 和 AOF 两种持久化方式。",{"path":765,"title":766,"description":767},"\u002Ftutorials\u002Fdatabase\u002Fredis\u002Fredis-principle","Redis 底层原理","数据结构、线程模型、网络模型。",{"path":769,"title":770,"description":771},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fbehaiver-patterns\u002Fobserver-pattern","观察者模式","观察者模式属于行为型模式，定义了对象之间的一对多的依赖关系，在这种模式中，当一个对象的状态发生变化时，所有依赖于它的对象都会得到通知，并且执行相关操作。观察者模式又被成为“发布—订阅模式”，即发布者发生改变后，会通知所有订阅者。",{"path":773,"title":774,"description":11},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Ffactory-pattern","工厂模式",{"path":776,"title":777,"description":778},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fcreate-patterns\u002Fsingleton-pattern","单例模式","单例模式是最常用的设计模式之一，他可以保证在整个应用中，某个类只存在一个实例化对象，即全局使用到该类的只有一个对象，这种模式在需要限制某些类的实例数量时非常有用，通常全局只需要一个该对象即可，如一些配置文件映射对象、数据库连接对象等。",{"path":780,"title":781,"description":782},"\u002Ftutorials\u002Fdev-idea\u002Fdesign-patterns\u002Fstructural-patterns\u002Fadapter-pattern","适配器模式","适配器模式是一种结构型模式，可以将一个类的接口转换成客户端所期望的另一种接口，适配器模式可以帮助开发人员在不修改现有代码的情况下，将不兼容的类组合在一起。",{"path":784,"title":785,"description":786},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-basic-operations","Git 创建版本库","在 Git 上创建版本库有两种方式，一种是直接拷贝远程 Git 仓库到本地，另外一种是我们自己创建本地的版本库。",{"path":788,"title":789,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-branch-manage","Git 分支管理",{"path":791,"title":792,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-content-operations","Git 仓库内容操作",{"path":794,"title":795,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-introduce-install","Git 介绍和安装",{"path":797,"title":798,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-remote-manage","Git 远程管理",{"path":800,"title":801,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fgit\u002Fgit-workspace-index-repo","Git 工作原理",{"path":803,"title":804,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fhomebrew","HomeBrew 教程",{"path":806,"title":807,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fidea\u002Fshortcuts","快捷键",{"path":809,"title":810,"description":11},"\u002Ftutorials\u002Fdev-tools\u002Fmaven\u002Fintroduce-install-config","Maven - 介绍、安装、配置",{"path":812,"title":813,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fbasic-knowledge","2. 基础知识",{"path":815,"title":816,"description":817},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomponent-communication","9. 组件通信","在前面的章节内，介绍了 Vue 中最核心的内容——组件的介绍和使用，和 Java 等编程语言相反，组件并不近似于这些变成语言中的类，类可以通过类或者其实例化的对象来相互交互，但 Vue 组件之间的作用域是相互独立的，这就意味着不同组件之间的数据无法相互引用。",{"path":819,"title":820,"description":821},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcomputed","4. 计算属性","虽然直接在模板中使用表达式方便，但是如果在模板中添加很多逻辑，会让模板变的臃肿且难维护，耦合度较高。有没有一种简单的方式来实现呢？答案是有的。",{"path":823,"title":824,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fcreate-vue-project","1. 环境搭建及安装",{"path":826,"title":827,"description":828},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Flife-cycle","6. 生命周期","生命周期是指组件从创建、挂载、更新到销毁的整个过程中所经历的一系列阶段。在 Vue 中，每个组件都有自己的生命周期，可以通过生命周期钩子函数来监听和处理组件在不同阶段的行为和状态。",{"path":830,"title":831,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fother-api","10. 其他 API",{"path":833,"title":834,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fpinia","8. Pinia",{"path":836,"title":837,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Frouter","7. 路由",{"path":839,"title":840,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Ftemplate-grammar","3. 指令及模板语法",{"path":842,"title":843,"description":11},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fvue3-new-component","11. Vue3 新组件",{"path":845,"title":846,"description":847},"\u002Ftutorials\u002Ffront-end\u002Fvue3\u002Fwatch","5. 监视","Watch 是 Vue 提供的一个用于监视响应式数据变化并执行相应操作的 API，能够对响应式数据的变化做出一些操作的功能。Vue3 中的 Watch 支持多种用法，包括监视响应式对象、ref 对象、数组、函数等。",{"path":849,"title":850,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-introduction","Kafka 简介与安装",{"path":852,"title":853,"description":11},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-producer-consumer","Kafka 生产者与消费者",{"path":855,"title":856,"description":857},"\u002Ftutorials\u002Fmq\u002Fkafka\u002Fkafka-springboot","Spring Boot 整合 Kafka","Spring Kafka 提供了对 Apache Kafka 的便捷集成。",{"path":859,"title":860,"description":861},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-exchange","RabbitMQ Exchange 详解","Exchange（交换机）是 RabbitMQ 的核心组件，负责接收生产者发送的消息，并根据规则将消息路由到一个或多个队列。",{"path":863,"title":864,"description":11},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-introduction","RabbitMQ 简介与安装",{"path":866,"title":867,"description":868},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-reliability","RabbitMQ 消息可靠性","消息可靠性是消息队列的核心要求，RabbitMQ 提供了多种机制来保证消息不丢失。",{"path":870,"title":871,"description":872},"\u002Ftutorials\u002Fmq\u002Frabbitmq\u002Frabbitmq-springboot","Spring Boot 整合 RabbitMQ","Spring AMQP 提供了对 RabbitMQ 的便捷集成，大大简化了开发工作。",{"path":874,"title":875,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-client","RocketMQ 客户端使用",{"path":877,"title":878,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-concepts","RocketMQ 核心概念",{"path":880,"title":881,"description":11},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-installation","RocketMQ 安装部署",{"path":883,"title":884,"description":885},"\u002Ftutorials\u002Fmq\u002Frocketmq\u002Frocketmq-message-type","RocketMQ 消息类型","RocketMQ 支持多种消息类型，满足不同业务场景需求。",{"id":887,"title":146,"body":888,"description":147,"extension":4322,"meta":4323,"navigation":970,"path":145,"seo":4324,"stem":4325,"__hash__":4326},"docs\u002Fgolang\u002Fadvanced\u002Fgo-concurrency.md",{"type":889,"value":890,"toc":4292},"minimark",[891,894,899,902,907,1077,1081,1134,1138,1329,1333,1336,1340,1447,1450,1557,1561,1695,1699,1875,1879,2000,2003,2006,2236,2239,2301,2304,2376,2379,2382,2574,2577,2900,2903,3293,3296,3300,3461,3465,3649,3653,3749,3753,3906,3910,3913,4288],[892,893,147],"p",{},[895,896,898],"h2",{"id":897},"goroutine","Goroutine",[892,900,901],{},"Goroutine 是 Go 的轻量级线程，由 Go 运行时管理。",[903,904,906],"h3",{"id":905},"创建-goroutine","创建 Goroutine",[908,909,913],"pre",{"className":910,"code":911,"language":912,"meta":11,"style":11},"language-go shiki shiki-themes github-light github-light github-dark","\u002F\u002F 使用 go 关键字启动\nfunc sayHello() {\n    fmt.Println(\"Hello\")\n}\n\ngo sayHello()  \u002F\u002F 异步执行\n\n\u002F\u002F 匿名函数\ngo func() {\n    fmt.Println(\"匿名函数\")\n}()\n\n\u002F\u002F 带参数\ngo func(msg string) {\n    fmt.Println(msg)\n}(\"hello\")\n","go",[914,915,916,925,940,959,965,972,985,990,996,1006,1020,1026,1031,1037,1056,1066],"code",{"__ignoreMap":11},[917,918,921],"span",{"class":919,"line":920},"line",1,[917,922,924],{"class":923},"sCsY4","\u002F\u002F 使用 go 关键字启动\n",[917,926,928,932,936],{"class":919,"line":927},2,[917,929,931],{"class":930},"s8jYJ","func",[917,933,935],{"class":934},"snPdu"," sayHello",[917,937,939],{"class":938},"sxrX7","() {\n",[917,941,943,946,949,952,956],{"class":919,"line":942},3,[917,944,945],{"class":938},"    fmt.",[917,947,948],{"class":934},"Println",[917,950,951],{"class":938},"(",[917,953,955],{"class":954},"sIIMD","\"Hello\"",[917,957,958],{"class":938},")\n",[917,960,962],{"class":919,"line":961},4,[917,963,964],{"class":938},"}\n",[917,966,968],{"class":919,"line":967},5,[917,969,971],{"emptyLinePlaceholder":970},true,"\n",[917,973,975,977,979,982],{"class":919,"line":974},6,[917,976,912],{"class":930},[917,978,935],{"class":934},[917,980,981],{"class":938},"()  ",[917,983,984],{"class":923},"\u002F\u002F 异步执行\n",[917,986,988],{"class":919,"line":987},7,[917,989,971],{"emptyLinePlaceholder":970},[917,991,993],{"class":919,"line":992},8,[917,994,995],{"class":923},"\u002F\u002F 匿名函数\n",[917,997,999,1001,1004],{"class":919,"line":998},9,[917,1000,912],{"class":930},[917,1002,1003],{"class":930}," func",[917,1005,939],{"class":938},[917,1007,1009,1011,1013,1015,1018],{"class":919,"line":1008},10,[917,1010,945],{"class":938},[917,1012,948],{"class":934},[917,1014,951],{"class":938},[917,1016,1017],{"class":954},"\"匿名函数\"",[917,1019,958],{"class":938},[917,1021,1023],{"class":919,"line":1022},11,[917,1024,1025],{"class":938},"}()\n",[917,1027,1029],{"class":919,"line":1028},12,[917,1030,971],{"emptyLinePlaceholder":970},[917,1032,1034],{"class":919,"line":1033},13,[917,1035,1036],{"class":923},"\u002F\u002F 带参数\n",[917,1038,1040,1042,1044,1046,1050,1053],{"class":919,"line":1039},14,[917,1041,912],{"class":930},[917,1043,1003],{"class":930},[917,1045,951],{"class":938},[917,1047,1049],{"class":1048},"sP4rz","msg",[917,1051,1052],{"class":930}," string",[917,1054,1055],{"class":938},") {\n",[917,1057,1059,1061,1063],{"class":919,"line":1058},15,[917,1060,945],{"class":938},[917,1062,948],{"class":934},[917,1064,1065],{"class":938},"(msg)\n",[917,1067,1069,1072,1075],{"class":919,"line":1068},16,[917,1070,1071],{"class":938},"}(",[917,1073,1074],{"class":954},"\"hello\"",[917,1076,958],{"class":938},[903,1078,1080],{"id":1079},"goroutine-特点","Goroutine 特点",[1082,1083,1084,1098],"table",{},[1085,1086,1087],"thead",{},[1088,1089,1090,1095],"tr",{},[1091,1092,1094],"th",{"align":1093},"left","特点",[1091,1096,1097],{"align":1093},"说明",[1099,1100,1101,1110,1118,1126],"tbody",{},[1088,1102,1103,1107],{},[1104,1105,1106],"td",{"align":1093},"轻量级",[1104,1108,1109],{"align":1093},"初始栈只有 2KB，可动态增长",[1088,1111,1112,1115],{},[1104,1113,1114],{"align":1093},"数量大",[1104,1116,1117],{"align":1093},"可以创建数十万个 Goroutine",[1088,1119,1120,1123],{},[1104,1121,1122],{"align":1093},"调度高效",[1104,1124,1125],{"align":1093},"Go 运行时调度，无需系统调用",[1088,1127,1128,1131],{},[1104,1129,1130],{"align":1093},"共享内存",[1104,1132,1133],{"align":1093},"同一进程内，可直接访问共享变量",[903,1135,1137],{"id":1136},"等待-goroutine-完成","等待 Goroutine 完成",[908,1139,1141],{"className":910,"code":1140,"language":912,"meta":11,"style":11},"import \"sync\"\n\nfunc main() {\n    var wg sync.WaitGroup\n\n    for i := 0; i \u003C 5; i++ {\n        wg.Add(1)  \u002F\u002F 计数 +1\n        go func(n int) {\n            defer wg.Done()  \u002F\u002F 计数 -1\n            fmt.Println(n)\n        }(i)\n    }\n\n    wg.Wait()  \u002F\u002F 等待所有 Goroutine 完成\n    fmt.Println(\"全部完成\")\n}\n",[914,1142,1143,1157,1161,1170,1186,1190,1223,1242,1259,1275,1285,1290,1295,1299,1312,1325],{"__ignoreMap":11},[917,1144,1145,1148,1151,1154],{"class":919,"line":920},[917,1146,1147],{"class":930},"import",[917,1149,1150],{"class":954}," \"",[917,1152,1153],{"class":934},"sync",[917,1155,1156],{"class":954},"\"\n",[917,1158,1159],{"class":919,"line":927},[917,1160,971],{"emptyLinePlaceholder":970},[917,1162,1163,1165,1168],{"class":919,"line":942},[917,1164,931],{"class":930},[917,1166,1167],{"class":934}," main",[917,1169,939],{"class":938},[917,1171,1172,1175,1178,1180,1183],{"class":919,"line":961},[917,1173,1174],{"class":930},"    var",[917,1176,1177],{"class":938}," wg ",[917,1179,1153],{"class":934},[917,1181,1182],{"class":938},".",[917,1184,1185],{"class":934},"WaitGroup\n",[917,1187,1188],{"class":919,"line":967},[917,1189,971],{"emptyLinePlaceholder":970},[917,1191,1192,1195,1198,1201,1205,1208,1211,1214,1217,1220],{"class":919,"line":974},[917,1193,1194],{"class":930},"    for",[917,1196,1197],{"class":938}," i ",[917,1199,1200],{"class":930},":=",[917,1202,1204],{"class":1203},"sBjJW"," 0",[917,1206,1207],{"class":938},"; i ",[917,1209,1210],{"class":930},"\u003C",[917,1212,1213],{"class":1203}," 5",[917,1215,1216],{"class":938},"; i",[917,1218,1219],{"class":930},"++",[917,1221,1222],{"class":938}," {\n",[917,1224,1225,1228,1231,1233,1236,1239],{"class":919,"line":987},[917,1226,1227],{"class":938},"        wg.",[917,1229,1230],{"class":934},"Add",[917,1232,951],{"class":938},[917,1234,1235],{"class":1203},"1",[917,1237,1238],{"class":938},")  ",[917,1240,1241],{"class":923},"\u002F\u002F 计数 +1\n",[917,1243,1244,1247,1249,1251,1254,1257],{"class":919,"line":992},[917,1245,1246],{"class":930},"        go",[917,1248,1003],{"class":930},[917,1250,951],{"class":938},[917,1252,1253],{"class":1048},"n",[917,1255,1256],{"class":930}," int",[917,1258,1055],{"class":938},[917,1260,1261,1264,1267,1270,1272],{"class":919,"line":998},[917,1262,1263],{"class":930},"            defer",[917,1265,1266],{"class":938}," wg.",[917,1268,1269],{"class":934},"Done",[917,1271,981],{"class":938},[917,1273,1274],{"class":923},"\u002F\u002F 计数 -1\n",[917,1276,1277,1280,1282],{"class":919,"line":1008},[917,1278,1279],{"class":938},"            fmt.",[917,1281,948],{"class":934},[917,1283,1284],{"class":938},"(n)\n",[917,1286,1287],{"class":919,"line":1022},[917,1288,1289],{"class":938},"        }(i)\n",[917,1291,1292],{"class":919,"line":1028},[917,1293,1294],{"class":938},"    }\n",[917,1296,1297],{"class":919,"line":1033},[917,1298,971],{"emptyLinePlaceholder":970},[917,1300,1301,1304,1307,1309],{"class":919,"line":1039},[917,1302,1303],{"class":938},"    wg.",[917,1305,1306],{"class":934},"Wait",[917,1308,981],{"class":938},[917,1310,1311],{"class":923},"\u002F\u002F 等待所有 Goroutine 完成\n",[917,1313,1314,1316,1318,1320,1323],{"class":919,"line":1058},[917,1315,945],{"class":938},[917,1317,948],{"class":934},[917,1319,951],{"class":938},[917,1321,1322],{"class":954},"\"全部完成\"",[917,1324,958],{"class":938},[917,1326,1327],{"class":919,"line":1068},[917,1328,964],{"class":938},[895,1330,1332],{"id":1331},"channel","Channel",[892,1334,1335],{},"Channel 是 Goroutine 之间通信的管道。",[903,1337,1339],{"id":1338},"创建-channel","创建 Channel",[908,1341,1343],{"className":910,"code":1342,"language":912,"meta":11,"style":11},"\u002F\u002F 无缓冲 Channel\nch := make(chan int)\n\n\u002F\u002F 有缓冲 Channel\nch := make(chan int, 10)  \u002F\u002F 容量为 10\n\n\u002F\u002F 只发送 Channel\nvar sendOnly chan\u003C- int\n\n\u002F\u002F 只接收 Channel\nvar recvOnly \u003C-chan int\n",[914,1344,1345,1350,1369,1373,1378,1403,1407,1412,1426,1430,1435],{"__ignoreMap":11},[917,1346,1347],{"class":919,"line":920},[917,1348,1349],{"class":923},"\u002F\u002F 无缓冲 Channel\n",[917,1351,1352,1355,1357,1360,1362,1365,1367],{"class":919,"line":927},[917,1353,1354],{"class":938},"ch ",[917,1356,1200],{"class":930},[917,1358,1359],{"class":934}," make",[917,1361,951],{"class":938},[917,1363,1364],{"class":930},"chan",[917,1366,1256],{"class":930},[917,1368,958],{"class":938},[917,1370,1371],{"class":919,"line":942},[917,1372,971],{"emptyLinePlaceholder":970},[917,1374,1375],{"class":919,"line":961},[917,1376,1377],{"class":923},"\u002F\u002F 有缓冲 Channel\n",[917,1379,1380,1382,1384,1386,1388,1390,1392,1395,1398,1400],{"class":919,"line":967},[917,1381,1354],{"class":938},[917,1383,1200],{"class":930},[917,1385,1359],{"class":934},[917,1387,951],{"class":938},[917,1389,1364],{"class":930},[917,1391,1256],{"class":930},[917,1393,1394],{"class":938},", ",[917,1396,1397],{"class":1203},"10",[917,1399,1238],{"class":938},[917,1401,1402],{"class":923},"\u002F\u002F 容量为 10\n",[917,1404,1405],{"class":919,"line":974},[917,1406,971],{"emptyLinePlaceholder":970},[917,1408,1409],{"class":919,"line":987},[917,1410,1411],{"class":923},"\u002F\u002F 只发送 Channel\n",[917,1413,1414,1417,1420,1423],{"class":919,"line":992},[917,1415,1416],{"class":930},"var",[917,1418,1419],{"class":938}," sendOnly ",[917,1421,1422],{"class":930},"chan\u003C-",[917,1424,1425],{"class":930}," int\n",[917,1427,1428],{"class":919,"line":998},[917,1429,971],{"emptyLinePlaceholder":970},[917,1431,1432],{"class":919,"line":1008},[917,1433,1434],{"class":923},"\u002F\u002F 只接收 Channel\n",[917,1436,1437,1439,1442,1445],{"class":919,"line":1022},[917,1438,1416],{"class":930},[917,1440,1441],{"class":938}," recvOnly ",[917,1443,1444],{"class":930},"\u003C-chan",[917,1446,1425],{"class":930},[903,1448,1449],{"id":1449},"发送和接收",[908,1451,1453],{"className":910,"code":1452,"language":912,"meta":11,"style":11},"ch := make(chan int)\n\n\u002F\u002F 发送\ngo func() {\n    ch \u003C- 42  \u002F\u002F 发送数据\n}()\n\n\u002F\u002F 接收\nvalue := \u003C-ch  \u002F\u002F 接收数据\nfmt.Println(value)\n\n\u002F\u002F 接收并丢弃\n\u003C-ch\n",[914,1454,1455,1471,1475,1480,1488,1502,1506,1510,1515,1531,1541,1545,1550],{"__ignoreMap":11},[917,1456,1457,1459,1461,1463,1465,1467,1469],{"class":919,"line":920},[917,1458,1354],{"class":938},[917,1460,1200],{"class":930},[917,1462,1359],{"class":934},[917,1464,951],{"class":938},[917,1466,1364],{"class":930},[917,1468,1256],{"class":930},[917,1470,958],{"class":938},[917,1472,1473],{"class":919,"line":927},[917,1474,971],{"emptyLinePlaceholder":970},[917,1476,1477],{"class":919,"line":942},[917,1478,1479],{"class":923},"\u002F\u002F 发送\n",[917,1481,1482,1484,1486],{"class":919,"line":961},[917,1483,912],{"class":930},[917,1485,1003],{"class":930},[917,1487,939],{"class":938},[917,1489,1490,1493,1496,1499],{"class":919,"line":967},[917,1491,1492],{"class":938},"    ch ",[917,1494,1495],{"class":930},"\u003C-",[917,1497,1498],{"class":1203}," 42",[917,1500,1501],{"class":923},"  \u002F\u002F 发送数据\n",[917,1503,1504],{"class":919,"line":974},[917,1505,1025],{"class":938},[917,1507,1508],{"class":919,"line":987},[917,1509,971],{"emptyLinePlaceholder":970},[917,1511,1512],{"class":919,"line":992},[917,1513,1514],{"class":923},"\u002F\u002F 接收\n",[917,1516,1517,1520,1522,1525,1528],{"class":919,"line":998},[917,1518,1519],{"class":938},"value ",[917,1521,1200],{"class":930},[917,1523,1524],{"class":930}," \u003C-",[917,1526,1527],{"class":938},"ch  ",[917,1529,1530],{"class":923},"\u002F\u002F 接收数据\n",[917,1532,1533,1536,1538],{"class":919,"line":1008},[917,1534,1535],{"class":938},"fmt.",[917,1537,948],{"class":934},[917,1539,1540],{"class":938},"(value)\n",[917,1542,1543],{"class":919,"line":1022},[917,1544,971],{"emptyLinePlaceholder":970},[917,1546,1547],{"class":919,"line":1028},[917,1548,1549],{"class":923},"\u002F\u002F 接收并丢弃\n",[917,1551,1552,1554],{"class":919,"line":1033},[917,1553,1495],{"class":930},[917,1555,1556],{"class":938},"ch\n",[903,1558,1560],{"id":1559},"无缓冲-vs-有缓冲","无缓冲 vs 有缓冲",[908,1562,1564],{"className":910,"code":1563,"language":912,"meta":11,"style":11},"\u002F\u002F 无缓冲：同步通信，发送和接收必须同时就绪\nch := make(chan int)\ngo func() {\n    ch \u003C- 1  \u002F\u002F 阻塞，直到有接收者\n}()\n\u003C-ch  \u002F\u002F 阻塞，直到有发送者\n\n\u002F\u002F 有缓冲：异步通信，缓冲满时发送阻塞，空时接收阻塞\nch := make(chan int, 3)\nch \u003C- 1  \u002F\u002F 不阻塞\nch \u003C- 2  \u002F\u002F 不阻塞\nch \u003C- 3  \u002F\u002F 不阻塞\nch \u003C- 4  \u002F\u002F 阻塞，缓冲已满\n",[914,1565,1566,1571,1587,1595,1607,1611,1620,1624,1629,1650,1661,1672,1683],{"__ignoreMap":11},[917,1567,1568],{"class":919,"line":920},[917,1569,1570],{"class":923},"\u002F\u002F 无缓冲：同步通信，发送和接收必须同时就绪\n",[917,1572,1573,1575,1577,1579,1581,1583,1585],{"class":919,"line":927},[917,1574,1354],{"class":938},[917,1576,1200],{"class":930},[917,1578,1359],{"class":934},[917,1580,951],{"class":938},[917,1582,1364],{"class":930},[917,1584,1256],{"class":930},[917,1586,958],{"class":938},[917,1588,1589,1591,1593],{"class":919,"line":942},[917,1590,912],{"class":930},[917,1592,1003],{"class":930},[917,1594,939],{"class":938},[917,1596,1597,1599,1601,1604],{"class":919,"line":961},[917,1598,1492],{"class":938},[917,1600,1495],{"class":930},[917,1602,1603],{"class":1203}," 1",[917,1605,1606],{"class":923},"  \u002F\u002F 阻塞，直到有接收者\n",[917,1608,1609],{"class":919,"line":967},[917,1610,1025],{"class":938},[917,1612,1613,1615,1617],{"class":919,"line":974},[917,1614,1495],{"class":930},[917,1616,1527],{"class":938},[917,1618,1619],{"class":923},"\u002F\u002F 阻塞，直到有发送者\n",[917,1621,1622],{"class":919,"line":987},[917,1623,971],{"emptyLinePlaceholder":970},[917,1625,1626],{"class":919,"line":992},[917,1627,1628],{"class":923},"\u002F\u002F 有缓冲：异步通信，缓冲满时发送阻塞，空时接收阻塞\n",[917,1630,1631,1633,1635,1637,1639,1641,1643,1645,1648],{"class":919,"line":998},[917,1632,1354],{"class":938},[917,1634,1200],{"class":930},[917,1636,1359],{"class":934},[917,1638,951],{"class":938},[917,1640,1364],{"class":930},[917,1642,1256],{"class":930},[917,1644,1394],{"class":938},[917,1646,1647],{"class":1203},"3",[917,1649,958],{"class":938},[917,1651,1652,1654,1656,1658],{"class":919,"line":1008},[917,1653,1354],{"class":938},[917,1655,1495],{"class":930},[917,1657,1603],{"class":1203},[917,1659,1660],{"class":923},"  \u002F\u002F 不阻塞\n",[917,1662,1663,1665,1667,1670],{"class":919,"line":1022},[917,1664,1354],{"class":938},[917,1666,1495],{"class":930},[917,1668,1669],{"class":1203}," 2",[917,1671,1660],{"class":923},[917,1673,1674,1676,1678,1681],{"class":919,"line":1028},[917,1675,1354],{"class":938},[917,1677,1495],{"class":930},[917,1679,1680],{"class":1203}," 3",[917,1682,1660],{"class":923},[917,1684,1685,1687,1689,1692],{"class":919,"line":1033},[917,1686,1354],{"class":938},[917,1688,1495],{"class":930},[917,1690,1691],{"class":1203}," 4",[917,1693,1694],{"class":923},"  \u002F\u002F 阻塞，缓冲已满\n",[903,1696,1698],{"id":1697},"关闭-channel","关闭 Channel",[908,1700,1702],{"className":910,"code":1701,"language":912,"meta":11,"style":11},"ch := make(chan int, 3)\nch \u003C- 1\nch \u003C- 2\nclose(ch)  \u002F\u002F 关闭 channel\n\n\u002F\u002F 关闭后仍可接收\nfmt.Println(\u003C-ch)  \u002F\u002F 1\nfmt.Println(\u003C-ch)  \u002F\u002F 2\nfmt.Println(\u003C-ch)  \u002F\u002F 0（默认值，channel 已空）\n\n\u002F\u002F 检查 channel 是否关闭\nvalue, ok := \u003C-ch\nif !ok {\n    fmt.Println(\"channel 已关闭\")\n}\n\n\u002F\u002F 向已关闭的 channel 发送会 panic\n\u002F\u002F ch \u003C- 3  \u002F\u002F panic!\n",[914,1703,1704,1724,1733,1742,1753,1757,1762,1778,1793,1808,1812,1817,1828,1839,1852,1856,1860,1866],{"__ignoreMap":11},[917,1705,1706,1708,1710,1712,1714,1716,1718,1720,1722],{"class":919,"line":920},[917,1707,1354],{"class":938},[917,1709,1200],{"class":930},[917,1711,1359],{"class":934},[917,1713,951],{"class":938},[917,1715,1364],{"class":930},[917,1717,1256],{"class":930},[917,1719,1394],{"class":938},[917,1721,1647],{"class":1203},[917,1723,958],{"class":938},[917,1725,1726,1728,1730],{"class":919,"line":927},[917,1727,1354],{"class":938},[917,1729,1495],{"class":930},[917,1731,1732],{"class":1203}," 1\n",[917,1734,1735,1737,1739],{"class":919,"line":942},[917,1736,1354],{"class":938},[917,1738,1495],{"class":930},[917,1740,1741],{"class":1203}," 2\n",[917,1743,1744,1747,1750],{"class":919,"line":961},[917,1745,1746],{"class":934},"close",[917,1748,1749],{"class":938},"(ch)  ",[917,1751,1752],{"class":923},"\u002F\u002F 关闭 channel\n",[917,1754,1755],{"class":919,"line":967},[917,1756,971],{"emptyLinePlaceholder":970},[917,1758,1759],{"class":919,"line":974},[917,1760,1761],{"class":923},"\u002F\u002F 关闭后仍可接收\n",[917,1763,1764,1766,1768,1770,1772,1775],{"class":919,"line":987},[917,1765,1535],{"class":938},[917,1767,948],{"class":934},[917,1769,951],{"class":938},[917,1771,1495],{"class":930},[917,1773,1774],{"class":938},"ch)  ",[917,1776,1777],{"class":923},"\u002F\u002F 1\n",[917,1779,1780,1782,1784,1786,1788,1790],{"class":919,"line":992},[917,1781,1535],{"class":938},[917,1783,948],{"class":934},[917,1785,951],{"class":938},[917,1787,1495],{"class":930},[917,1789,1774],{"class":938},[917,1791,1792],{"class":923},"\u002F\u002F 2\n",[917,1794,1795,1797,1799,1801,1803,1805],{"class":919,"line":998},[917,1796,1535],{"class":938},[917,1798,948],{"class":934},[917,1800,951],{"class":938},[917,1802,1495],{"class":930},[917,1804,1774],{"class":938},[917,1806,1807],{"class":923},"\u002F\u002F 0（默认值，channel 已空）\n",[917,1809,1810],{"class":919,"line":1008},[917,1811,971],{"emptyLinePlaceholder":970},[917,1813,1814],{"class":919,"line":1022},[917,1815,1816],{"class":923},"\u002F\u002F 检查 channel 是否关闭\n",[917,1818,1819,1822,1824,1826],{"class":919,"line":1028},[917,1820,1821],{"class":938},"value, ok ",[917,1823,1200],{"class":930},[917,1825,1524],{"class":930},[917,1827,1556],{"class":938},[917,1829,1830,1833,1836],{"class":919,"line":1033},[917,1831,1832],{"class":930},"if",[917,1834,1835],{"class":930}," !",[917,1837,1838],{"class":938},"ok {\n",[917,1840,1841,1843,1845,1847,1850],{"class":919,"line":1039},[917,1842,945],{"class":938},[917,1844,948],{"class":934},[917,1846,951],{"class":938},[917,1848,1849],{"class":954},"\"channel 已关闭\"",[917,1851,958],{"class":938},[917,1853,1854],{"class":919,"line":1058},[917,1855,964],{"class":938},[917,1857,1858],{"class":919,"line":1068},[917,1859,971],{"emptyLinePlaceholder":970},[917,1861,1863],{"class":919,"line":1862},17,[917,1864,1865],{"class":923},"\u002F\u002F 向已关闭的 channel 发送会 panic\n",[917,1867,1869,1872],{"class":919,"line":1868},18,[917,1870,1871],{"class":923},"\u002F\u002F ch \u003C- 3",[917,1873,1874],{"class":923},"  \u002F\u002F panic!\n",[903,1876,1878],{"id":1877},"遍历-channel","遍历 Channel",[908,1880,1882],{"className":910,"code":1881,"language":912,"meta":11,"style":11},"ch := make(chan int, 5)\ngo func() {\n    for i := 0; i \u003C 5; i++ {\n        ch \u003C- i\n    }\n    close(ch)  \u002F\u002F 必须关闭，否则 range 会阻塞\n}()\n\n\u002F\u002F 使用 range 遍历\nfor value := range ch {\n    fmt.Println(value)\n}\n",[914,1883,1884,1905,1913,1935,1945,1949,1959,1963,1967,1972,1988,1996],{"__ignoreMap":11},[917,1885,1886,1888,1890,1892,1894,1896,1898,1900,1903],{"class":919,"line":920},[917,1887,1354],{"class":938},[917,1889,1200],{"class":930},[917,1891,1359],{"class":934},[917,1893,951],{"class":938},[917,1895,1364],{"class":930},[917,1897,1256],{"class":930},[917,1899,1394],{"class":938},[917,1901,1902],{"class":1203},"5",[917,1904,958],{"class":938},[917,1906,1907,1909,1911],{"class":919,"line":927},[917,1908,912],{"class":930},[917,1910,1003],{"class":930},[917,1912,939],{"class":938},[917,1914,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933],{"class":919,"line":942},[917,1916,1194],{"class":930},[917,1918,1197],{"class":938},[917,1920,1200],{"class":930},[917,1922,1204],{"class":1203},[917,1924,1207],{"class":938},[917,1926,1210],{"class":930},[917,1928,1213],{"class":1203},[917,1930,1216],{"class":938},[917,1932,1219],{"class":930},[917,1934,1222],{"class":938},[917,1936,1937,1940,1942],{"class":919,"line":961},[917,1938,1939],{"class":938},"        ch ",[917,1941,1495],{"class":930},[917,1943,1944],{"class":938}," i\n",[917,1946,1947],{"class":919,"line":967},[917,1948,1294],{"class":938},[917,1950,1951,1954,1956],{"class":919,"line":974},[917,1952,1953],{"class":934},"    close",[917,1955,1749],{"class":938},[917,1957,1958],{"class":923},"\u002F\u002F 必须关闭，否则 range 会阻塞\n",[917,1960,1961],{"class":919,"line":987},[917,1962,1025],{"class":938},[917,1964,1965],{"class":919,"line":992},[917,1966,971],{"emptyLinePlaceholder":970},[917,1968,1969],{"class":919,"line":998},[917,1970,1971],{"class":923},"\u002F\u002F 使用 range 遍历\n",[917,1973,1974,1977,1980,1982,1985],{"class":919,"line":1008},[917,1975,1976],{"class":930},"for",[917,1978,1979],{"class":938}," value ",[917,1981,1200],{"class":930},[917,1983,1984],{"class":930}," range",[917,1986,1987],{"class":938}," ch {\n",[917,1989,1990,1992,1994],{"class":919,"line":1022},[917,1991,945],{"class":938},[917,1993,948],{"class":934},[917,1995,1540],{"class":938},[917,1997,1998],{"class":919,"line":1028},[917,1999,964],{"class":938},[895,2001,2002],{"id":2002},"select",[892,2004,2005],{},"select 用于同时监听多个 Channel。",[908,2007,2009],{"className":910,"code":2008,"language":912,"meta":11,"style":11},"ch1 := make(chan int)\nch2 := make(chan string)\n\ngo func() {\n    time.Sleep(time.Second)\n    ch1 \u003C- 1\n}()\n\ngo func() {\n    time.Sleep(2 * time.Second)\n    ch2 \u003C- \"hello\"\n}()\n\n\u002F\u002F 等待多个 channel\nselect {\ncase v := \u003C-ch1:\n    fmt.Println(\"ch1:\", v)\ncase v := \u003C-ch2:\n    fmt.Println(\"ch2:\", v)\ncase \u003C-time.After(3 * time.Second):\n    fmt.Println(\"超时\")\n}\n",[914,2010,2011,2028,2045,2049,2057,2068,2077,2081,2085,2093,2110,2120,2124,2128,2133,2139,2154,2168,2181,2195,2217,2231],{"__ignoreMap":11},[917,2012,2013,2016,2018,2020,2022,2024,2026],{"class":919,"line":920},[917,2014,2015],{"class":938},"ch1 ",[917,2017,1200],{"class":930},[917,2019,1359],{"class":934},[917,2021,951],{"class":938},[917,2023,1364],{"class":930},[917,2025,1256],{"class":930},[917,2027,958],{"class":938},[917,2029,2030,2033,2035,2037,2039,2041,2043],{"class":919,"line":927},[917,2031,2032],{"class":938},"ch2 ",[917,2034,1200],{"class":930},[917,2036,1359],{"class":934},[917,2038,951],{"class":938},[917,2040,1364],{"class":930},[917,2042,1052],{"class":930},[917,2044,958],{"class":938},[917,2046,2047],{"class":919,"line":942},[917,2048,971],{"emptyLinePlaceholder":970},[917,2050,2051,2053,2055],{"class":919,"line":961},[917,2052,912],{"class":930},[917,2054,1003],{"class":930},[917,2056,939],{"class":938},[917,2058,2059,2062,2065],{"class":919,"line":967},[917,2060,2061],{"class":938},"    time.",[917,2063,2064],{"class":934},"Sleep",[917,2066,2067],{"class":938},"(time.Second)\n",[917,2069,2070,2073,2075],{"class":919,"line":974},[917,2071,2072],{"class":938},"    ch1 ",[917,2074,1495],{"class":930},[917,2076,1732],{"class":1203},[917,2078,2079],{"class":919,"line":987},[917,2080,1025],{"class":938},[917,2082,2083],{"class":919,"line":992},[917,2084,971],{"emptyLinePlaceholder":970},[917,2086,2087,2089,2091],{"class":919,"line":998},[917,2088,912],{"class":930},[917,2090,1003],{"class":930},[917,2092,939],{"class":938},[917,2094,2095,2097,2099,2101,2104,2107],{"class":919,"line":1008},[917,2096,2061],{"class":938},[917,2098,2064],{"class":934},[917,2100,951],{"class":938},[917,2102,2103],{"class":1203},"2",[917,2105,2106],{"class":930}," *",[917,2108,2109],{"class":938}," time.Second)\n",[917,2111,2112,2115,2117],{"class":919,"line":1022},[917,2113,2114],{"class":938},"    ch2 ",[917,2116,1495],{"class":930},[917,2118,2119],{"class":954}," \"hello\"\n",[917,2121,2122],{"class":919,"line":1028},[917,2123,1025],{"class":938},[917,2125,2126],{"class":919,"line":1033},[917,2127,971],{"emptyLinePlaceholder":970},[917,2129,2130],{"class":919,"line":1039},[917,2131,2132],{"class":923},"\u002F\u002F 等待多个 channel\n",[917,2134,2135,2137],{"class":919,"line":1058},[917,2136,2002],{"class":930},[917,2138,1222],{"class":938},[917,2140,2141,2144,2147,2149,2151],{"class":919,"line":1068},[917,2142,2143],{"class":930},"case",[917,2145,2146],{"class":938}," v ",[917,2148,1200],{"class":930},[917,2150,1524],{"class":930},[917,2152,2153],{"class":938},"ch1:\n",[917,2155,2156,2158,2160,2162,2165],{"class":919,"line":1862},[917,2157,945],{"class":938},[917,2159,948],{"class":934},[917,2161,951],{"class":938},[917,2163,2164],{"class":954},"\"ch1:\"",[917,2166,2167],{"class":938},", v)\n",[917,2169,2170,2172,2174,2176,2178],{"class":919,"line":1868},[917,2171,2143],{"class":930},[917,2173,2146],{"class":938},[917,2175,1200],{"class":930},[917,2177,1524],{"class":930},[917,2179,2180],{"class":938},"ch2:\n",[917,2182,2184,2186,2188,2190,2193],{"class":919,"line":2183},19,[917,2185,945],{"class":938},[917,2187,948],{"class":934},[917,2189,951],{"class":938},[917,2191,2192],{"class":954},"\"ch2:\"",[917,2194,2167],{"class":938},[917,2196,2198,2200,2202,2205,2208,2210,2212,2214],{"class":919,"line":2197},20,[917,2199,2143],{"class":930},[917,2201,1524],{"class":930},[917,2203,2204],{"class":938},"time.",[917,2206,2207],{"class":934},"After",[917,2209,951],{"class":938},[917,2211,1647],{"class":1203},[917,2213,2106],{"class":930},[917,2215,2216],{"class":938}," time.Second):\n",[917,2218,2220,2222,2224,2226,2229],{"class":919,"line":2219},21,[917,2221,945],{"class":938},[917,2223,948],{"class":934},[917,2225,951],{"class":938},[917,2227,2228],{"class":954},"\"超时\"",[917,2230,958],{"class":938},[917,2232,2234],{"class":919,"line":2233},22,[917,2235,964],{"class":938},[903,2237,2238],{"id":2238},"非阻塞操作",[908,2240,2242],{"className":910,"code":2241,"language":912,"meta":11,"style":11},"select {\ncase v := \u003C-ch:\n    fmt.Println(\"接收:\", v)\ndefault:\n    fmt.Println(\"没有数据\")\n}\n",[914,2243,2244,2250,2263,2276,2284,2297],{"__ignoreMap":11},[917,2245,2246,2248],{"class":919,"line":920},[917,2247,2002],{"class":930},[917,2249,1222],{"class":938},[917,2251,2252,2254,2256,2258,2260],{"class":919,"line":927},[917,2253,2143],{"class":930},[917,2255,2146],{"class":938},[917,2257,1200],{"class":930},[917,2259,1524],{"class":930},[917,2261,2262],{"class":938},"ch:\n",[917,2264,2265,2267,2269,2271,2274],{"class":919,"line":942},[917,2266,945],{"class":938},[917,2268,948],{"class":934},[917,2270,951],{"class":938},[917,2272,2273],{"class":954},"\"接收:\"",[917,2275,2167],{"class":938},[917,2277,2278,2281],{"class":919,"line":961},[917,2279,2280],{"class":930},"default",[917,2282,2283],{"class":938},":\n",[917,2285,2286,2288,2290,2292,2295],{"class":919,"line":967},[917,2287,945],{"class":938},[917,2289,948],{"class":934},[917,2291,951],{"class":938},[917,2293,2294],{"class":954},"\"没有数据\"",[917,2296,958],{"class":938},[917,2298,2299],{"class":919,"line":974},[917,2300,964],{"class":938},[903,2302,2303],{"id":2303},"超时控制",[908,2305,2307],{"className":910,"code":2306,"language":912,"meta":11,"style":11},"select {\ncase result := \u003C-ch:\n    fmt.Println(\"结果:\", result)\ncase \u003C-time.After(5 * time.Second):\n    fmt.Println(\"超时\")\n}\n",[914,2308,2309,2315,2328,2342,2360,2372],{"__ignoreMap":11},[917,2310,2311,2313],{"class":919,"line":920},[917,2312,2002],{"class":930},[917,2314,1222],{"class":938},[917,2316,2317,2319,2322,2324,2326],{"class":919,"line":927},[917,2318,2143],{"class":930},[917,2320,2321],{"class":938}," result ",[917,2323,1200],{"class":930},[917,2325,1524],{"class":930},[917,2327,2262],{"class":938},[917,2329,2330,2332,2334,2336,2339],{"class":919,"line":942},[917,2331,945],{"class":938},[917,2333,948],{"class":934},[917,2335,951],{"class":938},[917,2337,2338],{"class":954},"\"结果:\"",[917,2340,2341],{"class":938},", result)\n",[917,2343,2344,2346,2348,2350,2352,2354,2356,2358],{"class":919,"line":961},[917,2345,2143],{"class":930},[917,2347,1524],{"class":930},[917,2349,2204],{"class":938},[917,2351,2207],{"class":934},[917,2353,951],{"class":938},[917,2355,1902],{"class":1203},[917,2357,2106],{"class":930},[917,2359,2216],{"class":938},[917,2361,2362,2364,2366,2368,2370],{"class":919,"line":967},[917,2363,945],{"class":938},[917,2365,948],{"class":934},[917,2367,951],{"class":938},[917,2369,2228],{"class":954},[917,2371,958],{"class":938},[917,2373,2374],{"class":919,"line":974},[917,2375,964],{"class":938},[895,2377,2378],{"id":2378},"并发模式",[903,2380,2381],{"id":2381},"生产者-消费者",[908,2383,2385],{"className":910,"code":2384,"language":912,"meta":11,"style":11},"func producer(ch chan\u003C- int) {\n    for i := 0; i \u003C 10; i++ {\n        ch \u003C- i\n        fmt.Println(\"生产:\", i)\n    }\n    close(ch)\n}\n\nfunc consumer(ch \u003C-chan int) {\n    for v := range ch {\n        fmt.Println(\"消费:\", v)\n    }\n}\n\nfunc main() {\n    ch := make(chan int, 5)\n    go producer(ch)\n    consumer(ch)\n}\n",[914,2386,2387,2406,2429,2437,2452,2456,2463,2467,2471,2489,2501,2514,2518,2522,2526,2534,2554,2563,2570],{"__ignoreMap":11},[917,2388,2389,2391,2394,2396,2399,2402,2404],{"class":919,"line":920},[917,2390,931],{"class":930},[917,2392,2393],{"class":934}," producer",[917,2395,951],{"class":938},[917,2397,2398],{"class":1048},"ch",[917,2400,2401],{"class":930}," chan\u003C-",[917,2403,1256],{"class":930},[917,2405,1055],{"class":938},[917,2407,2408,2410,2412,2414,2416,2418,2420,2423,2425,2427],{"class":919,"line":927},[917,2409,1194],{"class":930},[917,2411,1197],{"class":938},[917,2413,1200],{"class":930},[917,2415,1204],{"class":1203},[917,2417,1207],{"class":938},[917,2419,1210],{"class":930},[917,2421,2422],{"class":1203}," 10",[917,2424,1216],{"class":938},[917,2426,1219],{"class":930},[917,2428,1222],{"class":938},[917,2430,2431,2433,2435],{"class":919,"line":942},[917,2432,1939],{"class":938},[917,2434,1495],{"class":930},[917,2436,1944],{"class":938},[917,2438,2439,2442,2444,2446,2449],{"class":919,"line":961},[917,2440,2441],{"class":938},"        fmt.",[917,2443,948],{"class":934},[917,2445,951],{"class":938},[917,2447,2448],{"class":954},"\"生产:\"",[917,2450,2451],{"class":938},", i)\n",[917,2453,2454],{"class":919,"line":967},[917,2455,1294],{"class":938},[917,2457,2458,2460],{"class":919,"line":974},[917,2459,1953],{"class":934},[917,2461,2462],{"class":938},"(ch)\n",[917,2464,2465],{"class":919,"line":987},[917,2466,964],{"class":938},[917,2468,2469],{"class":919,"line":992},[917,2470,971],{"emptyLinePlaceholder":970},[917,2472,2473,2475,2478,2480,2482,2485,2487],{"class":919,"line":998},[917,2474,931],{"class":930},[917,2476,2477],{"class":934}," consumer",[917,2479,951],{"class":938},[917,2481,2398],{"class":1048},[917,2483,2484],{"class":930}," \u003C-chan",[917,2486,1256],{"class":930},[917,2488,1055],{"class":938},[917,2490,2491,2493,2495,2497,2499],{"class":919,"line":1008},[917,2492,1194],{"class":930},[917,2494,2146],{"class":938},[917,2496,1200],{"class":930},[917,2498,1984],{"class":930},[917,2500,1987],{"class":938},[917,2502,2503,2505,2507,2509,2512],{"class":919,"line":1022},[917,2504,2441],{"class":938},[917,2506,948],{"class":934},[917,2508,951],{"class":938},[917,2510,2511],{"class":954},"\"消费:\"",[917,2513,2167],{"class":938},[917,2515,2516],{"class":919,"line":1028},[917,2517,1294],{"class":938},[917,2519,2520],{"class":919,"line":1033},[917,2521,964],{"class":938},[917,2523,2524],{"class":919,"line":1039},[917,2525,971],{"emptyLinePlaceholder":970},[917,2527,2528,2530,2532],{"class":919,"line":1058},[917,2529,931],{"class":930},[917,2531,1167],{"class":934},[917,2533,939],{"class":938},[917,2535,2536,2538,2540,2542,2544,2546,2548,2550,2552],{"class":919,"line":1068},[917,2537,1492],{"class":938},[917,2539,1200],{"class":930},[917,2541,1359],{"class":934},[917,2543,951],{"class":938},[917,2545,1364],{"class":930},[917,2547,1256],{"class":930},[917,2549,1394],{"class":938},[917,2551,1902],{"class":1203},[917,2553,958],{"class":938},[917,2555,2556,2559,2561],{"class":919,"line":1862},[917,2557,2558],{"class":930},"    go",[917,2560,2393],{"class":934},[917,2562,2462],{"class":938},[917,2564,2565,2568],{"class":919,"line":1868},[917,2566,2567],{"class":934},"    consumer",[917,2569,2462],{"class":938},[917,2571,2572],{"class":919,"line":2183},[917,2573,964],{"class":938},[903,2575,2576],{"id":2576},"工作池",[908,2578,2580],{"className":910,"code":2579,"language":912,"meta":11,"style":11},"func worker(id int, jobs \u003C-chan int, results chan\u003C- int) {\n    for job := range jobs {\n        fmt.Printf(\"Worker %d 处理 Job %d\\n\", id, job)\n        time.Sleep(time.Second)\n        results \u003C- job * 2\n    }\n}\n\nfunc main() {\n    jobs := make(chan int, 100)\n    results := make(chan int, 100)\n\n    \u002F\u002F 启动 3 个 worker\n    for w := 1; w \u003C= 3; w++ {\n        go worker(w, jobs, results)\n    }\n\n    \u002F\u002F 发送 9 个任务\n    for j := 1; j \u003C= 9; j++ {\n        jobs \u003C- j\n    }\n    close(jobs)\n\n    \u002F\u002F 收集结果\n    for i := 1; i \u003C= 9; i++ {\n        \u003C-results\n    }\n}\n",[914,2581,2582,2616,2630,2657,2666,2680,2684,2688,2692,2700,2722,2743,2747,2752,2778,2787,2791,2795,2800,2826,2836,2840,2847,2852,2858,2881,2890,2895],{"__ignoreMap":11},[917,2583,2584,2586,2589,2591,2594,2596,2598,2601,2603,2605,2607,2610,2612,2614],{"class":919,"line":920},[917,2585,931],{"class":930},[917,2587,2588],{"class":934}," worker",[917,2590,951],{"class":938},[917,2592,2593],{"class":1048},"id",[917,2595,1256],{"class":930},[917,2597,1394],{"class":938},[917,2599,2600],{"class":1048},"jobs",[917,2602,2484],{"class":930},[917,2604,1256],{"class":930},[917,2606,1394],{"class":938},[917,2608,2609],{"class":1048},"results",[917,2611,2401],{"class":930},[917,2613,1256],{"class":930},[917,2615,1055],{"class":938},[917,2617,2618,2620,2623,2625,2627],{"class":919,"line":927},[917,2619,1194],{"class":930},[917,2621,2622],{"class":938}," job ",[917,2624,1200],{"class":930},[917,2626,1984],{"class":930},[917,2628,2629],{"class":938}," jobs {\n",[917,2631,2632,2634,2637,2639,2642,2645,2648,2651,2654],{"class":919,"line":942},[917,2633,2441],{"class":938},[917,2635,2636],{"class":934},"Printf",[917,2638,951],{"class":938},[917,2640,2641],{"class":954},"\"Worker ",[917,2643,2644],{"class":1203},"%d",[917,2646,2647],{"class":954}," 处理 Job ",[917,2649,2650],{"class":1203},"%d\\n",[917,2652,2653],{"class":954},"\"",[917,2655,2656],{"class":938},", id, job)\n",[917,2658,2659,2662,2664],{"class":919,"line":961},[917,2660,2661],{"class":938},"        time.",[917,2663,2064],{"class":934},[917,2665,2067],{"class":938},[917,2667,2668,2671,2673,2675,2678],{"class":919,"line":967},[917,2669,2670],{"class":938},"        results ",[917,2672,1495],{"class":930},[917,2674,2622],{"class":938},[917,2676,2677],{"class":930},"*",[917,2679,1741],{"class":1203},[917,2681,2682],{"class":919,"line":974},[917,2683,1294],{"class":938},[917,2685,2686],{"class":919,"line":987},[917,2687,964],{"class":938},[917,2689,2690],{"class":919,"line":992},[917,2691,971],{"emptyLinePlaceholder":970},[917,2693,2694,2696,2698],{"class":919,"line":998},[917,2695,931],{"class":930},[917,2697,1167],{"class":934},[917,2699,939],{"class":938},[917,2701,2702,2705,2707,2709,2711,2713,2715,2717,2720],{"class":919,"line":1008},[917,2703,2704],{"class":938},"    jobs ",[917,2706,1200],{"class":930},[917,2708,1359],{"class":934},[917,2710,951],{"class":938},[917,2712,1364],{"class":930},[917,2714,1256],{"class":930},[917,2716,1394],{"class":938},[917,2718,2719],{"class":1203},"100",[917,2721,958],{"class":938},[917,2723,2724,2727,2729,2731,2733,2735,2737,2739,2741],{"class":919,"line":1022},[917,2725,2726],{"class":938},"    results ",[917,2728,1200],{"class":930},[917,2730,1359],{"class":934},[917,2732,951],{"class":938},[917,2734,1364],{"class":930},[917,2736,1256],{"class":930},[917,2738,1394],{"class":938},[917,2740,2719],{"class":1203},[917,2742,958],{"class":938},[917,2744,2745],{"class":919,"line":1028},[917,2746,971],{"emptyLinePlaceholder":970},[917,2748,2749],{"class":919,"line":1033},[917,2750,2751],{"class":923},"    \u002F\u002F 启动 3 个 worker\n",[917,2753,2754,2756,2759,2761,2763,2766,2769,2771,2774,2776],{"class":919,"line":1039},[917,2755,1194],{"class":930},[917,2757,2758],{"class":938}," w ",[917,2760,1200],{"class":930},[917,2762,1603],{"class":1203},[917,2764,2765],{"class":938},"; w ",[917,2767,2768],{"class":930},"\u003C=",[917,2770,1680],{"class":1203},[917,2772,2773],{"class":938},"; w",[917,2775,1219],{"class":930},[917,2777,1222],{"class":938},[917,2779,2780,2782,2784],{"class":919,"line":1058},[917,2781,1246],{"class":930},[917,2783,2588],{"class":934},[917,2785,2786],{"class":938},"(w, jobs, results)\n",[917,2788,2789],{"class":919,"line":1068},[917,2790,1294],{"class":938},[917,2792,2793],{"class":919,"line":1862},[917,2794,971],{"emptyLinePlaceholder":970},[917,2796,2797],{"class":919,"line":1868},[917,2798,2799],{"class":923},"    \u002F\u002F 发送 9 个任务\n",[917,2801,2802,2804,2807,2809,2811,2814,2816,2819,2822,2824],{"class":919,"line":2183},[917,2803,1194],{"class":930},[917,2805,2806],{"class":938}," j ",[917,2808,1200],{"class":930},[917,2810,1603],{"class":1203},[917,2812,2813],{"class":938},"; j ",[917,2815,2768],{"class":930},[917,2817,2818],{"class":1203}," 9",[917,2820,2821],{"class":938},"; j",[917,2823,1219],{"class":930},[917,2825,1222],{"class":938},[917,2827,2828,2831,2833],{"class":919,"line":2197},[917,2829,2830],{"class":938},"        jobs ",[917,2832,1495],{"class":930},[917,2834,2835],{"class":938}," j\n",[917,2837,2838],{"class":919,"line":2219},[917,2839,1294],{"class":938},[917,2841,2842,2844],{"class":919,"line":2233},[917,2843,1953],{"class":934},[917,2845,2846],{"class":938},"(jobs)\n",[917,2848,2850],{"class":919,"line":2849},23,[917,2851,971],{"emptyLinePlaceholder":970},[917,2853,2855],{"class":919,"line":2854},24,[917,2856,2857],{"class":923},"    \u002F\u002F 收集结果\n",[917,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877,2879],{"class":919,"line":2860},25,[917,2862,1194],{"class":930},[917,2864,1197],{"class":938},[917,2866,1200],{"class":930},[917,2868,1603],{"class":1203},[917,2870,1207],{"class":938},[917,2872,2768],{"class":930},[917,2874,2818],{"class":1203},[917,2876,1216],{"class":938},[917,2878,1219],{"class":930},[917,2880,1222],{"class":938},[917,2882,2884,2887],{"class":919,"line":2883},26,[917,2885,2886],{"class":930},"        \u003C-",[917,2888,2889],{"class":938},"results\n",[917,2891,2893],{"class":919,"line":2892},27,[917,2894,1294],{"class":938},[917,2896,2898],{"class":919,"line":2897},28,[917,2899,964],{"class":938},[903,2901,2902],{"id":2902},"扇入扇出",[908,2904,2906],{"className":910,"code":2905,"language":912,"meta":11,"style":11},"\u002F\u002F 扇出：一个 channel 分发给多个 goroutine\nfunc fanOut(ch \u003C-chan int, n int) []\u003C-chan int {\n    outs := make([]\u003C-chan int, n)\n    for i := 0; i \u003C n; i++ {\n        out := make(chan int)\n        outs[i] = out\n        go func() {\n            for v := range ch {\n                out \u003C- v * 2\n            }\n            close(out)\n        }()\n    }\n    return outs\n}\n\n\u002F\u002F 扇入：多个 channel 合并为一个\nfunc fanIn(chs ...\u003C-chan int) \u003C-chan int {\n    out := make(chan int)\n    var wg sync.WaitGroup\n    \n    for _, ch := range chs {\n        wg.Add(1)\n        go func(c \u003C-chan int) {\n            defer wg.Done()\n            for v := range c {\n                out \u003C- v\n            }\n        }(ch)\n    }\n    \n    go func() {\n        wg.Wait()\n        close(out)\n    }()\n    \n    return out\n}\n",[914,2907,2908,2913,2943,2962,2983,3000,3011,3019,3032,3045,3050,3058,3063,3067,3075,3079,3083,3088,3114,3131,3143,3148,3162,3174,3191,3202,3215,3224,3228,3234,3239,3244,3253,3262,3270,3276,3281,3288],{"__ignoreMap":11},[917,2909,2910],{"class":919,"line":920},[917,2911,2912],{"class":923},"\u002F\u002F 扇出：一个 channel 分发给多个 goroutine\n",[917,2914,2915,2917,2920,2922,2924,2926,2928,2930,2932,2934,2937,2939,2941],{"class":919,"line":927},[917,2916,931],{"class":930},[917,2918,2919],{"class":934}," fanOut",[917,2921,951],{"class":938},[917,2923,2398],{"class":1048},[917,2925,2484],{"class":930},[917,2927,1256],{"class":930},[917,2929,1394],{"class":938},[917,2931,1253],{"class":1048},[917,2933,1256],{"class":930},[917,2935,2936],{"class":938},") []",[917,2938,1444],{"class":930},[917,2940,1256],{"class":930},[917,2942,1222],{"class":938},[917,2944,2945,2948,2950,2952,2955,2957,2959],{"class":919,"line":942},[917,2946,2947],{"class":938},"    outs ",[917,2949,1200],{"class":930},[917,2951,1359],{"class":934},[917,2953,2954],{"class":938},"([]",[917,2956,1444],{"class":930},[917,2958,1256],{"class":930},[917,2960,2961],{"class":938},", n)\n",[917,2963,2964,2966,2968,2970,2972,2974,2976,2979,2981],{"class":919,"line":961},[917,2965,1194],{"class":930},[917,2967,1197],{"class":938},[917,2969,1200],{"class":930},[917,2971,1204],{"class":1203},[917,2973,1207],{"class":938},[917,2975,1210],{"class":930},[917,2977,2978],{"class":938}," n; i",[917,2980,1219],{"class":930},[917,2982,1222],{"class":938},[917,2984,2985,2988,2990,2992,2994,2996,2998],{"class":919,"line":967},[917,2986,2987],{"class":938},"        out ",[917,2989,1200],{"class":930},[917,2991,1359],{"class":934},[917,2993,951],{"class":938},[917,2995,1364],{"class":930},[917,2997,1256],{"class":930},[917,2999,958],{"class":938},[917,3001,3002,3005,3008],{"class":919,"line":974},[917,3003,3004],{"class":938},"        outs[i] ",[917,3006,3007],{"class":930},"=",[917,3009,3010],{"class":938}," out\n",[917,3012,3013,3015,3017],{"class":919,"line":987},[917,3014,1246],{"class":930},[917,3016,1003],{"class":930},[917,3018,939],{"class":938},[917,3020,3021,3024,3026,3028,3030],{"class":919,"line":992},[917,3022,3023],{"class":930},"            for",[917,3025,2146],{"class":938},[917,3027,1200],{"class":930},[917,3029,1984],{"class":930},[917,3031,1987],{"class":938},[917,3033,3034,3037,3039,3041,3043],{"class":919,"line":998},[917,3035,3036],{"class":938},"                out ",[917,3038,1495],{"class":930},[917,3040,2146],{"class":938},[917,3042,2677],{"class":930},[917,3044,1741],{"class":1203},[917,3046,3047],{"class":919,"line":1008},[917,3048,3049],{"class":938},"            }\n",[917,3051,3052,3055],{"class":919,"line":1022},[917,3053,3054],{"class":934},"            close",[917,3056,3057],{"class":938},"(out)\n",[917,3059,3060],{"class":919,"line":1028},[917,3061,3062],{"class":938},"        }()\n",[917,3064,3065],{"class":919,"line":1033},[917,3066,1294],{"class":938},[917,3068,3069,3072],{"class":919,"line":1039},[917,3070,3071],{"class":930},"    return",[917,3073,3074],{"class":938}," outs\n",[917,3076,3077],{"class":919,"line":1058},[917,3078,964],{"class":938},[917,3080,3081],{"class":919,"line":1068},[917,3082,971],{"emptyLinePlaceholder":970},[917,3084,3085],{"class":919,"line":1862},[917,3086,3087],{"class":923},"\u002F\u002F 扇入：多个 channel 合并为一个\n",[917,3089,3090,3092,3095,3097,3100,3103,3105,3108,3110,3112],{"class":919,"line":1868},[917,3091,931],{"class":930},[917,3093,3094],{"class":934}," fanIn",[917,3096,951],{"class":938},[917,3098,3099],{"class":1048},"chs",[917,3101,3102],{"class":930}," ...\u003C-chan",[917,3104,1256],{"class":930},[917,3106,3107],{"class":938},") ",[917,3109,1444],{"class":930},[917,3111,1256],{"class":930},[917,3113,1222],{"class":938},[917,3115,3116,3119,3121,3123,3125,3127,3129],{"class":919,"line":2183},[917,3117,3118],{"class":938},"    out ",[917,3120,1200],{"class":930},[917,3122,1359],{"class":934},[917,3124,951],{"class":938},[917,3126,1364],{"class":930},[917,3128,1256],{"class":930},[917,3130,958],{"class":938},[917,3132,3133,3135,3137,3139,3141],{"class":919,"line":2197},[917,3134,1174],{"class":930},[917,3136,1177],{"class":938},[917,3138,1153],{"class":934},[917,3140,1182],{"class":938},[917,3142,1185],{"class":934},[917,3144,3145],{"class":919,"line":2219},[917,3146,3147],{"class":938},"    \n",[917,3149,3150,3152,3155,3157,3159],{"class":919,"line":2233},[917,3151,1194],{"class":930},[917,3153,3154],{"class":938}," _, ch ",[917,3156,1200],{"class":930},[917,3158,1984],{"class":930},[917,3160,3161],{"class":938}," chs {\n",[917,3163,3164,3166,3168,3170,3172],{"class":919,"line":2849},[917,3165,1227],{"class":938},[917,3167,1230],{"class":934},[917,3169,951],{"class":938},[917,3171,1235],{"class":1203},[917,3173,958],{"class":938},[917,3175,3176,3178,3180,3182,3185,3187,3189],{"class":919,"line":2854},[917,3177,1246],{"class":930},[917,3179,1003],{"class":930},[917,3181,951],{"class":938},[917,3183,3184],{"class":1048},"c",[917,3186,2484],{"class":930},[917,3188,1256],{"class":930},[917,3190,1055],{"class":938},[917,3192,3193,3195,3197,3199],{"class":919,"line":2860},[917,3194,1263],{"class":930},[917,3196,1266],{"class":938},[917,3198,1269],{"class":934},[917,3200,3201],{"class":938},"()\n",[917,3203,3204,3206,3208,3210,3212],{"class":919,"line":2883},[917,3205,3023],{"class":930},[917,3207,2146],{"class":938},[917,3209,1200],{"class":930},[917,3211,1984],{"class":930},[917,3213,3214],{"class":938}," c {\n",[917,3216,3217,3219,3221],{"class":919,"line":2892},[917,3218,3036],{"class":938},[917,3220,1495],{"class":930},[917,3222,3223],{"class":938}," v\n",[917,3225,3226],{"class":919,"line":2897},[917,3227,3049],{"class":938},[917,3229,3231],{"class":919,"line":3230},29,[917,3232,3233],{"class":938},"        }(ch)\n",[917,3235,3237],{"class":919,"line":3236},30,[917,3238,1294],{"class":938},[917,3240,3242],{"class":919,"line":3241},31,[917,3243,3147],{"class":938},[917,3245,3247,3249,3251],{"class":919,"line":3246},32,[917,3248,2558],{"class":930},[917,3250,1003],{"class":930},[917,3252,939],{"class":938},[917,3254,3256,3258,3260],{"class":919,"line":3255},33,[917,3257,1227],{"class":938},[917,3259,1306],{"class":934},[917,3261,3201],{"class":938},[917,3263,3265,3268],{"class":919,"line":3264},34,[917,3266,3267],{"class":934},"        close",[917,3269,3057],{"class":938},[917,3271,3273],{"class":919,"line":3272},35,[917,3274,3275],{"class":938},"    }()\n",[917,3277,3279],{"class":919,"line":3278},36,[917,3280,3147],{"class":938},[917,3282,3284,3286],{"class":919,"line":3283},37,[917,3285,3071],{"class":930},[917,3287,3010],{"class":938},[917,3289,3291],{"class":919,"line":3290},38,[917,3292,964],{"class":938},[895,3294,3295],{"id":3295},"同步原语",[903,3297,3299],{"id":3298},"syncmutex","sync.Mutex",[908,3301,3303],{"className":910,"code":3302,"language":912,"meta":11,"style":11},"type Counter struct {\n    mu    sync.Mutex\n    value int\n}\n\nfunc (c *Counter) Inc() {\n    c.mu.Lock()\n    defer c.mu.Unlock()\n    c.value++\n}\n\nfunc (c *Counter) Value() int {\n    c.mu.Lock()\n    defer c.mu.Unlock()\n    return c.value\n}\n",[914,3304,3305,3318,3330,3338,3342,3346,3368,3378,3391,3399,3403,3407,3432,3440,3450,3457],{"__ignoreMap":11},[917,3306,3307,3310,3313,3316],{"class":919,"line":920},[917,3308,3309],{"class":930},"type",[917,3311,3312],{"class":934}," Counter",[917,3314,3315],{"class":930}," struct",[917,3317,1222],{"class":938},[917,3319,3320,3323,3325,3327],{"class":919,"line":927},[917,3321,3322],{"class":938},"    mu    ",[917,3324,1153],{"class":934},[917,3326,1182],{"class":938},[917,3328,3329],{"class":934},"Mutex\n",[917,3331,3332,3335],{"class":919,"line":942},[917,3333,3334],{"class":938},"    value ",[917,3336,3337],{"class":930},"int\n",[917,3339,3340],{"class":919,"line":961},[917,3341,964],{"class":938},[917,3343,3344],{"class":919,"line":967},[917,3345,971],{"emptyLinePlaceholder":970},[917,3347,3348,3350,3353,3356,3358,3361,3363,3366],{"class":919,"line":974},[917,3349,931],{"class":930},[917,3351,3352],{"class":938}," (",[917,3354,3355],{"class":1048},"c ",[917,3357,2677],{"class":930},[917,3359,3360],{"class":934},"Counter",[917,3362,3107],{"class":938},[917,3364,3365],{"class":934},"Inc",[917,3367,939],{"class":938},[917,3369,3370,3373,3376],{"class":919,"line":987},[917,3371,3372],{"class":938},"    c.mu.",[917,3374,3375],{"class":934},"Lock",[917,3377,3201],{"class":938},[917,3379,3380,3383,3386,3389],{"class":919,"line":992},[917,3381,3382],{"class":930},"    defer",[917,3384,3385],{"class":938}," c.mu.",[917,3387,3388],{"class":934},"Unlock",[917,3390,3201],{"class":938},[917,3392,3393,3396],{"class":919,"line":998},[917,3394,3395],{"class":938},"    c.value",[917,3397,3398],{"class":930},"++\n",[917,3400,3401],{"class":919,"line":1008},[917,3402,964],{"class":938},[917,3404,3405],{"class":919,"line":1022},[917,3406,971],{"emptyLinePlaceholder":970},[917,3408,3409,3411,3413,3415,3417,3419,3421,3424,3427,3430],{"class":919,"line":1028},[917,3410,931],{"class":930},[917,3412,3352],{"class":938},[917,3414,3355],{"class":1048},[917,3416,2677],{"class":930},[917,3418,3360],{"class":934},[917,3420,3107],{"class":938},[917,3422,3423],{"class":934},"Value",[917,3425,3426],{"class":938},"() ",[917,3428,3429],{"class":930},"int",[917,3431,1222],{"class":938},[917,3433,3434,3436,3438],{"class":919,"line":1033},[917,3435,3372],{"class":938},[917,3437,3375],{"class":934},[917,3439,3201],{"class":938},[917,3441,3442,3444,3446,3448],{"class":919,"line":1039},[917,3443,3382],{"class":930},[917,3445,3385],{"class":938},[917,3447,3388],{"class":934},[917,3449,3201],{"class":938},[917,3451,3452,3454],{"class":919,"line":1058},[917,3453,3071],{"class":930},[917,3455,3456],{"class":938}," c.value\n",[917,3458,3459],{"class":919,"line":1068},[917,3460,964],{"class":938},[903,3462,3464],{"id":3463},"syncrwmutex","sync.RWMutex",[908,3466,3468],{"className":910,"code":3467,"language":912,"meta":11,"style":11},"type Cache struct {\n    mu   sync.RWMutex\n    data map[string]string\n}\n\nfunc (c *Cache) Get(key string) string {\n    c.mu.RLock()\n    defer c.mu.RUnlock()\n    return c.data[key]\n}\n\nfunc (c *Cache) Set(key, value string) {\n    c.mu.Lock()\n    defer c.mu.Unlock()\n    c.data[key] = value\n}\n",[914,3469,3470,3481,3493,3513,3517,3521,3552,3561,3572,3579,3583,3587,3617,3625,3635,3645],{"__ignoreMap":11},[917,3471,3472,3474,3477,3479],{"class":919,"line":920},[917,3473,3309],{"class":930},[917,3475,3476],{"class":934}," Cache",[917,3478,3315],{"class":930},[917,3480,1222],{"class":938},[917,3482,3483,3486,3488,3490],{"class":919,"line":927},[917,3484,3485],{"class":938},"    mu   ",[917,3487,1153],{"class":934},[917,3489,1182],{"class":938},[917,3491,3492],{"class":934},"RWMutex\n",[917,3494,3495,3498,3501,3504,3507,3510],{"class":919,"line":942},[917,3496,3497],{"class":938},"    data ",[917,3499,3500],{"class":930},"map",[917,3502,3503],{"class":938},"[",[917,3505,3506],{"class":930},"string",[917,3508,3509],{"class":938},"]",[917,3511,3512],{"class":930},"string\n",[917,3514,3515],{"class":919,"line":961},[917,3516,964],{"class":938},[917,3518,3519],{"class":919,"line":967},[917,3520,971],{"emptyLinePlaceholder":970},[917,3522,3523,3525,3527,3529,3531,3534,3536,3539,3541,3544,3546,3548,3550],{"class":919,"line":974},[917,3524,931],{"class":930},[917,3526,3352],{"class":938},[917,3528,3355],{"class":1048},[917,3530,2677],{"class":930},[917,3532,3533],{"class":934},"Cache",[917,3535,3107],{"class":938},[917,3537,3538],{"class":934},"Get",[917,3540,951],{"class":938},[917,3542,3543],{"class":1048},"key",[917,3545,1052],{"class":930},[917,3547,3107],{"class":938},[917,3549,3506],{"class":930},[917,3551,1222],{"class":938},[917,3553,3554,3556,3559],{"class":919,"line":987},[917,3555,3372],{"class":938},[917,3557,3558],{"class":934},"RLock",[917,3560,3201],{"class":938},[917,3562,3563,3565,3567,3570],{"class":919,"line":992},[917,3564,3382],{"class":930},[917,3566,3385],{"class":938},[917,3568,3569],{"class":934},"RUnlock",[917,3571,3201],{"class":938},[917,3573,3574,3576],{"class":919,"line":998},[917,3575,3071],{"class":930},[917,3577,3578],{"class":938}," c.data[key]\n",[917,3580,3581],{"class":919,"line":1008},[917,3582,964],{"class":938},[917,3584,3585],{"class":919,"line":1022},[917,3586,971],{"emptyLinePlaceholder":970},[917,3588,3589,3591,3593,3595,3597,3599,3601,3604,3606,3608,3610,3613,3615],{"class":919,"line":1028},[917,3590,931],{"class":930},[917,3592,3352],{"class":938},[917,3594,3355],{"class":1048},[917,3596,2677],{"class":930},[917,3598,3533],{"class":934},[917,3600,3107],{"class":938},[917,3602,3603],{"class":934},"Set",[917,3605,951],{"class":938},[917,3607,3543],{"class":1048},[917,3609,1394],{"class":938},[917,3611,3612],{"class":1048},"value",[917,3614,1052],{"class":930},[917,3616,1055],{"class":938},[917,3618,3619,3621,3623],{"class":919,"line":1033},[917,3620,3372],{"class":938},[917,3622,3375],{"class":934},[917,3624,3201],{"class":938},[917,3626,3627,3629,3631,3633],{"class":919,"line":1039},[917,3628,3382],{"class":930},[917,3630,3385],{"class":938},[917,3632,3388],{"class":934},[917,3634,3201],{"class":938},[917,3636,3637,3640,3642],{"class":919,"line":1058},[917,3638,3639],{"class":938},"    c.data[key] ",[917,3641,3007],{"class":930},[917,3643,3644],{"class":938}," value\n",[917,3646,3647],{"class":919,"line":1068},[917,3648,964],{"class":938},[903,3650,3652],{"id":3651},"synconce","sync.Once",[908,3654,3656],{"className":910,"code":3655,"language":912,"meta":11,"style":11},"var once sync.Once\nvar instance *Singleton\n\nfunc GetInstance() *Singleton {\n    once.Do(func() {\n        instance = &Singleton{}\n    })\n    return instance\n}\n",[914,3657,3658,3672,3684,3688,3704,3718,3733,3738,3745],{"__ignoreMap":11},[917,3659,3660,3662,3665,3667,3669],{"class":919,"line":920},[917,3661,1416],{"class":930},[917,3663,3664],{"class":938}," once ",[917,3666,1153],{"class":934},[917,3668,1182],{"class":938},[917,3670,3671],{"class":934},"Once\n",[917,3673,3674,3676,3679,3681],{"class":919,"line":927},[917,3675,1416],{"class":930},[917,3677,3678],{"class":938}," instance ",[917,3680,2677],{"class":930},[917,3682,3683],{"class":934},"Singleton\n",[917,3685,3686],{"class":919,"line":942},[917,3687,971],{"emptyLinePlaceholder":970},[917,3689,3690,3692,3695,3697,3699,3702],{"class":919,"line":961},[917,3691,931],{"class":930},[917,3693,3694],{"class":934}," GetInstance",[917,3696,3426],{"class":938},[917,3698,2677],{"class":930},[917,3700,3701],{"class":934},"Singleton",[917,3703,1222],{"class":938},[917,3705,3706,3709,3712,3714,3716],{"class":919,"line":967},[917,3707,3708],{"class":938},"    once.",[917,3710,3711],{"class":934},"Do",[917,3713,951],{"class":938},[917,3715,931],{"class":930},[917,3717,939],{"class":938},[917,3719,3720,3723,3725,3728,3730],{"class":919,"line":974},[917,3721,3722],{"class":938},"        instance ",[917,3724,3007],{"class":930},[917,3726,3727],{"class":930}," &",[917,3729,3701],{"class":934},[917,3731,3732],{"class":938},"{}\n",[917,3734,3735],{"class":919,"line":987},[917,3736,3737],{"class":938},"    })\n",[917,3739,3740,3742],{"class":919,"line":992},[917,3741,3071],{"class":930},[917,3743,3744],{"class":938}," instance\n",[917,3746,3747],{"class":919,"line":998},[917,3748,964],{"class":938},[903,3750,3752],{"id":3751},"syncpool","sync.Pool",[908,3754,3756],{"className":910,"code":3755,"language":912,"meta":11,"style":11},"var bufferPool = sync.Pool{\n    New: func() interface{} {\n        return new(bytes.Buffer)\n    },\n}\n\nfunc process() {\n    buf := bufferPool.Get().(*bytes.Buffer)\n    defer func() {\n        buf.Reset()\n        bufferPool.Put(buf)\n    }()\n    \n    \u002F\u002F 使用 buf...\n}\n",[914,3757,3758,3778,3793,3813,3818,3822,3826,3835,3860,3868,3878,3889,3893,3897,3902],{"__ignoreMap":11},[917,3759,3760,3762,3765,3767,3770,3772,3775],{"class":919,"line":920},[917,3761,1416],{"class":930},[917,3763,3764],{"class":938}," bufferPool ",[917,3766,3007],{"class":930},[917,3768,3769],{"class":934}," sync",[917,3771,1182],{"class":938},[917,3773,3774],{"class":934},"Pool",[917,3776,3777],{"class":938},"{\n",[917,3779,3780,3783,3785,3787,3790],{"class":919,"line":927},[917,3781,3782],{"class":938},"    New: ",[917,3784,931],{"class":930},[917,3786,3426],{"class":938},[917,3788,3789],{"class":930},"interface",[917,3791,3792],{"class":938},"{} {\n",[917,3794,3795,3798,3801,3803,3806,3808,3811],{"class":919,"line":942},[917,3796,3797],{"class":930},"        return",[917,3799,3800],{"class":934}," new",[917,3802,951],{"class":938},[917,3804,3805],{"class":934},"bytes",[917,3807,1182],{"class":938},[917,3809,3810],{"class":934},"Buffer",[917,3812,958],{"class":938},[917,3814,3815],{"class":919,"line":961},[917,3816,3817],{"class":938},"    },\n",[917,3819,3820],{"class":919,"line":967},[917,3821,964],{"class":938},[917,3823,3824],{"class":919,"line":974},[917,3825,971],{"emptyLinePlaceholder":970},[917,3827,3828,3830,3833],{"class":919,"line":987},[917,3829,931],{"class":930},[917,3831,3832],{"class":934}," process",[917,3834,939],{"class":938},[917,3836,3837,3840,3842,3845,3847,3850,3852,3854,3856,3858],{"class":919,"line":992},[917,3838,3839],{"class":938},"    buf ",[917,3841,1200],{"class":930},[917,3843,3844],{"class":938}," bufferPool.",[917,3846,3538],{"class":934},[917,3848,3849],{"class":938},"().(",[917,3851,2677],{"class":930},[917,3853,3805],{"class":934},[917,3855,1182],{"class":938},[917,3857,3810],{"class":934},[917,3859,958],{"class":938},[917,3861,3862,3864,3866],{"class":919,"line":998},[917,3863,3382],{"class":930},[917,3865,1003],{"class":930},[917,3867,939],{"class":938},[917,3869,3870,3873,3876],{"class":919,"line":1008},[917,3871,3872],{"class":938},"        buf.",[917,3874,3875],{"class":934},"Reset",[917,3877,3201],{"class":938},[917,3879,3880,3883,3886],{"class":919,"line":1022},[917,3881,3882],{"class":938},"        bufferPool.",[917,3884,3885],{"class":934},"Put",[917,3887,3888],{"class":938},"(buf)\n",[917,3890,3891],{"class":919,"line":1028},[917,3892,3275],{"class":938},[917,3894,3895],{"class":919,"line":1033},[917,3896,3147],{"class":938},[917,3898,3899],{"class":919,"line":1039},[917,3900,3901],{"class":923},"    \u002F\u002F 使用 buf...\n",[917,3903,3904],{"class":919,"line":1058},[917,3905,964],{"class":938},[895,3907,3909],{"id":3908},"context","Context",[892,3911,3912],{},"Context 用于控制 Goroutine 的生命周期。",[908,3914,3916],{"className":910,"code":3915,"language":912,"meta":11,"style":11},"import \"context\"\n\nfunc worker(ctx context.Context) {\n    for {\n        select {\n        case \u003C-ctx.Done():\n            fmt.Println(\"收到取消信号\")\n            return\n        default:\n            fmt.Println(\"工作中...\")\n            time.Sleep(time.Second)\n        }\n    }\n}\n\nfunc main() {\n    \u002F\u002F 可取消的 context\n    ctx, cancel := context.WithCancel(context.Background())\n    \n    go worker(ctx)\n    \n    time.Sleep(3 * time.Second)\n    cancel()  \u002F\u002F 取消\n    time.Sleep(time.Second)\n}\n\n\u002F\u002F 带超时\nctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\ndefer cancel()\n\n\u002F\u002F 带截止时间\nctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))\ndefer cancel()\n\n\u002F\u002F 带值\nctx := context.WithValue(context.Background(), \"key\", \"value\")\nvalue := ctx.Value(\"key\").(string)\n",[914,3917,3918,3928,3932,3952,3958,3965,3980,3993,3998,4005,4018,4027,4032,4036,4040,4044,4052,4057,4079,4083,4092,4096,4110,4120,4128,4132,4136,4141,4167,4177,4181,4186,4221,4229,4233,4238,4266],{"__ignoreMap":11},[917,3919,3920,3922,3924,3926],{"class":919,"line":920},[917,3921,1147],{"class":930},[917,3923,1150],{"class":954},[917,3925,3908],{"class":934},[917,3927,1156],{"class":954},[917,3929,3930],{"class":919,"line":927},[917,3931,971],{"emptyLinePlaceholder":970},[917,3933,3934,3936,3938,3940,3943,3946,3948,3950],{"class":919,"line":942},[917,3935,931],{"class":930},[917,3937,2588],{"class":934},[917,3939,951],{"class":938},[917,3941,3942],{"class":1048},"ctx",[917,3944,3945],{"class":934}," context",[917,3947,1182],{"class":938},[917,3949,3909],{"class":934},[917,3951,1055],{"class":938},[917,3953,3954,3956],{"class":919,"line":961},[917,3955,1194],{"class":930},[917,3957,1222],{"class":938},[917,3959,3960,3963],{"class":919,"line":967},[917,3961,3962],{"class":930},"        select",[917,3964,1222],{"class":938},[917,3966,3967,3970,3972,3975,3977],{"class":919,"line":974},[917,3968,3969],{"class":930},"        case",[917,3971,1524],{"class":930},[917,3973,3974],{"class":938},"ctx.",[917,3976,1269],{"class":934},[917,3978,3979],{"class":938},"():\n",[917,3981,3982,3984,3986,3988,3991],{"class":919,"line":987},[917,3983,1279],{"class":938},[917,3985,948],{"class":934},[917,3987,951],{"class":938},[917,3989,3990],{"class":954},"\"收到取消信号\"",[917,3992,958],{"class":938},[917,3994,3995],{"class":919,"line":992},[917,3996,3997],{"class":930},"            return\n",[917,3999,4000,4003],{"class":919,"line":998},[917,4001,4002],{"class":930},"        default",[917,4004,2283],{"class":938},[917,4006,4007,4009,4011,4013,4016],{"class":919,"line":1008},[917,4008,1279],{"class":938},[917,4010,948],{"class":934},[917,4012,951],{"class":938},[917,4014,4015],{"class":954},"\"工作中...\"",[917,4017,958],{"class":938},[917,4019,4020,4023,4025],{"class":919,"line":1022},[917,4021,4022],{"class":938},"            time.",[917,4024,2064],{"class":934},[917,4026,2067],{"class":938},[917,4028,4029],{"class":919,"line":1028},[917,4030,4031],{"class":938},"        }\n",[917,4033,4034],{"class":919,"line":1033},[917,4035,1294],{"class":938},[917,4037,4038],{"class":919,"line":1039},[917,4039,964],{"class":938},[917,4041,4042],{"class":919,"line":1058},[917,4043,971],{"emptyLinePlaceholder":970},[917,4045,4046,4048,4050],{"class":919,"line":1068},[917,4047,931],{"class":930},[917,4049,1167],{"class":934},[917,4051,939],{"class":938},[917,4053,4054],{"class":919,"line":1862},[917,4055,4056],{"class":923},"    \u002F\u002F 可取消的 context\n",[917,4058,4059,4062,4064,4067,4070,4073,4076],{"class":919,"line":1868},[917,4060,4061],{"class":938},"    ctx, cancel ",[917,4063,1200],{"class":930},[917,4065,4066],{"class":938}," context.",[917,4068,4069],{"class":934},"WithCancel",[917,4071,4072],{"class":938},"(context.",[917,4074,4075],{"class":934},"Background",[917,4077,4078],{"class":938},"())\n",[917,4080,4081],{"class":919,"line":2183},[917,4082,3147],{"class":938},[917,4084,4085,4087,4089],{"class":919,"line":2197},[917,4086,2558],{"class":930},[917,4088,2588],{"class":934},[917,4090,4091],{"class":938},"(ctx)\n",[917,4093,4094],{"class":919,"line":2219},[917,4095,3147],{"class":938},[917,4097,4098,4100,4102,4104,4106,4108],{"class":919,"line":2233},[917,4099,2061],{"class":938},[917,4101,2064],{"class":934},[917,4103,951],{"class":938},[917,4105,1647],{"class":1203},[917,4107,2106],{"class":930},[917,4109,2109],{"class":938},[917,4111,4112,4115,4117],{"class":919,"line":2849},[917,4113,4114],{"class":934},"    cancel",[917,4116,981],{"class":938},[917,4118,4119],{"class":923},"\u002F\u002F 取消\n",[917,4121,4122,4124,4126],{"class":919,"line":2854},[917,4123,2061],{"class":938},[917,4125,2064],{"class":934},[917,4127,2067],{"class":938},[917,4129,4130],{"class":919,"line":2860},[917,4131,964],{"class":938},[917,4133,4134],{"class":919,"line":2883},[917,4135,971],{"emptyLinePlaceholder":970},[917,4137,4138],{"class":919,"line":2892},[917,4139,4140],{"class":923},"\u002F\u002F 带超时\n",[917,4142,4143,4146,4148,4150,4153,4155,4157,4160,4162,4164],{"class":919,"line":2897},[917,4144,4145],{"class":938},"ctx, cancel ",[917,4147,1200],{"class":930},[917,4149,4066],{"class":938},[917,4151,4152],{"class":934},"WithTimeout",[917,4154,4072],{"class":938},[917,4156,4075],{"class":934},[917,4158,4159],{"class":938},"(), ",[917,4161,1902],{"class":1203},[917,4163,2677],{"class":930},[917,4165,4166],{"class":938},"time.Second)\n",[917,4168,4169,4172,4175],{"class":919,"line":3230},[917,4170,4171],{"class":930},"defer",[917,4173,4174],{"class":934}," cancel",[917,4176,3201],{"class":938},[917,4178,4179],{"class":919,"line":3236},[917,4180,971],{"emptyLinePlaceholder":970},[917,4182,4183],{"class":919,"line":3241},[917,4184,4185],{"class":923},"\u002F\u002F 带截止时间\n",[917,4187,4188,4190,4192,4194,4197,4199,4201,4204,4207,4210,4212,4214,4216,4218],{"class":919,"line":3246},[917,4189,4145],{"class":938},[917,4191,1200],{"class":930},[917,4193,4066],{"class":938},[917,4195,4196],{"class":934},"WithDeadline",[917,4198,4072],{"class":938},[917,4200,4075],{"class":934},[917,4202,4203],{"class":938},"(), time.",[917,4205,4206],{"class":934},"Now",[917,4208,4209],{"class":938},"().",[917,4211,1230],{"class":934},[917,4213,951],{"class":938},[917,4215,1902],{"class":1203},[917,4217,2677],{"class":930},[917,4219,4220],{"class":938},"time.Second))\n",[917,4222,4223,4225,4227],{"class":919,"line":3255},[917,4224,4171],{"class":930},[917,4226,4174],{"class":934},[917,4228,3201],{"class":938},[917,4230,4231],{"class":919,"line":3264},[917,4232,971],{"emptyLinePlaceholder":970},[917,4234,4235],{"class":919,"line":3272},[917,4236,4237],{"class":923},"\u002F\u002F 带值\n",[917,4239,4240,4243,4245,4247,4250,4252,4254,4256,4259,4261,4264],{"class":919,"line":3278},[917,4241,4242],{"class":938},"ctx ",[917,4244,1200],{"class":930},[917,4246,4066],{"class":938},[917,4248,4249],{"class":934},"WithValue",[917,4251,4072],{"class":938},[917,4253,4075],{"class":934},[917,4255,4159],{"class":938},[917,4257,4258],{"class":954},"\"key\"",[917,4260,1394],{"class":938},[917,4262,4263],{"class":954},"\"value\"",[917,4265,958],{"class":938},[917,4267,4268,4270,4272,4275,4277,4279,4281,4284,4286],{"class":919,"line":3283},[917,4269,1519],{"class":938},[917,4271,1200],{"class":930},[917,4273,4274],{"class":938}," ctx.",[917,4276,3423],{"class":934},[917,4278,951],{"class":938},[917,4280,4258],{"class":954},[917,4282,4283],{"class":938},").(",[917,4285,3506],{"class":930},[917,4287,958],{"class":938},[4289,4290,4291],"style",{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":11,"searchDepth":927,"depth":927,"links":4293},[4294,4299,4306,4310,4315,4321],{"id":897,"depth":927,"text":898,"children":4295},[4296,4297,4298],{"id":905,"depth":942,"text":906},{"id":1079,"depth":942,"text":1080},{"id":1136,"depth":942,"text":1137},{"id":1331,"depth":927,"text":1332,"children":4300},[4301,4302,4303,4304,4305],{"id":1338,"depth":942,"text":1339},{"id":1449,"depth":942,"text":1449},{"id":1559,"depth":942,"text":1560},{"id":1697,"depth":942,"text":1698},{"id":1877,"depth":942,"text":1878},{"id":2002,"depth":927,"text":2002,"children":4307},[4308,4309],{"id":2238,"depth":942,"text":2238},{"id":2303,"depth":942,"text":2303},{"id":2378,"depth":927,"text":2378,"children":4311},[4312,4313,4314],{"id":2381,"depth":942,"text":2381},{"id":2576,"depth":942,"text":2576},{"id":2902,"depth":942,"text":2902},{"id":3295,"depth":927,"text":3295,"children":4316},[4317,4318,4319,4320],{"id":3298,"depth":942,"text":3299},{"id":3463,"depth":942,"text":3464},{"id":3651,"depth":942,"text":3652},{"id":3751,"depth":942,"text":3752},{"id":3908,"depth":927,"text":3909},"md",{},{"title":146,"description":147},"golang\u002Fadvanced\u002Fgo-concurrency","XR04wgcpt-3ISpggNAkm9jVu14EMarZXOP5wfHqMn9M",1775496424141]