1. 项目概述:为生产级Go项目注入AI智能的“技能包”

如果你是一名Go开发者,最近可能已经感受到了AI编程助手带来的效率革命。无论是Cursor、Claude Code还是GitHub Copilot,它们都能帮你生成代码片段、修复bug,甚至重构整个函数。但你是否也遇到过这样的困扰:AI生成的Go代码风格不统一,错误处理方式五花八门,测试用例写得像玩具,完全不符合你团队的生产级标准?每次都要花大量时间手动调整,AI带来的效率提升瞬间被抵消了一半。

这正是 samber/cc-skills-golang 这个项目要解决的核心痛点。它不是一个普通的代码库,而是一套专门为Go语言定制的“AI智能体技能包”。你可以把它理解为一套经过精心提炼的Go开发“最佳实践百科全书”,但它的载体不是给人看的文档,而是直接喂给AI编程助手的结构化指令集。当你的AI助手(比如Claude Code、Cursor等)加载了这些技能后,它生成的代码会天然符合Go社区的主流约定、你团队的内部规范,以及生产环境所需的健壮性要求。

这个项目的独特之处在于其“原子化”和“按需加载”的设计理念。它不像一个庞大的、臃肿的提示词模板,一股脑塞给AI导致上下文窗口爆炸。相反,它将Go开发的方方面面拆解成30多个独立的技能模块,比如 golang-error-handling (错误处理)、 golang-concurrency (并发编程)、 golang-observability (可观测性)。AI助手只在检测到相关编码场景时,才动态加载对应的技能细节。这意味着,你在写一个简单的HTTP处理器时,AI只会加载网络和错误处理相关的知识;而当你开始编写性能关键的并发代码时,关于 sync.Pool atomic 操作以及避免数据竞争的深层规则才会被激活。这种设计既保证了建议的专业性和深度,又不会拖慢AI的响应速度或浪费宝贵的上下文令牌。

根据项目提供的评估数据,使用这套技能包后,AI助手在Go相关任务上的整体正确率从 54% 飙升到了 98% ,提升了整整44个百分点。这个数字背后,是项目作者Samuel Berthe将自己多年在Go生产项目中的提交记录、代码审查经验和架构决策,通过Claude Code进行“蒸馏”,再经过人工严格编辑、测试和重构后沉淀下来的智慧结晶。正如项目README里那句醒目的声明:“ No AI slop here. AI-made skills are useless.” 这确保了技能的每一个建议都经得起实战考验,而非AI凭空臆造的“幻觉”。

无论你是独立开发者,还是团队的技术负责人,如果你希望将AI编程助手真正转化为符合生产标准的“资深Go工程师搭档”,而不仅仅是一个语法补全工具,那么深入理解并应用 cc-skills-golang ,将是提升整个研发效能的关键一步。

2. 核心设计理念:原子化技能与动态上下文管理

2.1 为什么是“技能”,而不是“提示词”?

在AI编程助手的生态里,我们常见的是“提示词”(Prompts)或“模板”(Templates)。它们通常是静态的、一次性的指令,比如“请用Go写一个RESTful API”。 cc-skills-golang 提出的“技能”(Skills)概念,是对此的范式升级。一个技能是一个 自包含的、可复用的指令集合 ,它封装了某个特定领域的专业知识(例如Go的数据库操作规范),并且被设计为可以与其他技能组合使用。

这种设计带来了几个根本性优势:

  1. 关注点分离 :将庞大的Go知识体系分解为 golang-code-style (代码风格)、 golang-testing (测试)、 golang-security (安全)等独立模块。开发者或团队可以根据项目需要,选择性地启用部分技能,而不是被迫接受一个“全能但臃肿”的单一提示。
  2. 一致性保证 :技能内部的定义是统一的。例如, golang-error-handling 技能会明确规定错误应该被包装、记录,并且永远不要返回裸的 errors.New 。当 golang-observability 技能被触发时,它会引用相同的错误处理规范来确保日志和追踪信息的一致性。这种跨技能的引用机制,避免了不同建议之间的冲突。
  3. 可维护性 :当Go语言发布新特性(比如泛型)或社区出现新的最佳实践时,你只需要更新对应的技能模块(如 golang-modernize ),而无需重写整个庞大的提示词库。这就像更新一个软件库,而不是重写整个应用程序。

2.2 动态加载与上下文经济

AI模型(如Claude、GPT)的上下文窗口是有限的宝贵资源。把一整本Go编程规范塞进上下文,不仅会挤占分析当前代码所需的空间,还可能因为信息过载导致模型输出质量下降。 cc-skills-golang 通过精巧的三层结构解决了这个问题:

  1. 技能描述层(Description) :这是每个技能YAML头文件里的一个简短摘要,通常只有几十到一百多个令牌(Token)。 这部分内容会在AI助手启动时被预加载 。它的作用就像一个“索引”或“触发器”,告诉AI:“我这里有一个关于Go错误处理的技能,当你看到用户代码中出现了 if err != nil 这类模式时,可以考虑激活我。” 所有技能的描述加起来,在项目启动时也只占用约1.1K令牌,成本极低。

  2. 核心知识层(SKILL.md) :这是技能的主文件,包含该领域最核心、最常用的规则和示例,大小控制在1K-2.5K令牌。 只有当AI根据描述层判断当前任务与该技能高度相关时,才会动态加载这个文件 。例如,用户开始编写一个数据库查询函数,AI就会加载 golang-database 技能的SKILL.md文件,获取关于SQL注入防护、连接池管理、上下文超时等具体建议。

  3. 深度参考层(References) :在SKILL.md中,会通过Markdown链接引用到 references/ 目录下更详细的文档。比如 golang-performance 技能的SKILL.md可能会提到“关于内存逃逸分析的细节,请参考 这里 ”。 这些深度内容只有在AI认为有必要进行深入分析时,才会被进一步加载 。这实现了知识的“懒加载”,将最庞大的知识体量(单个技能目录总令牌数可达10K)按需取用,最大化利用了上下文窗口。

这种机制,使得AI助手能够像一个经验丰富的工程师一样,在合适的时机运用合适的知识,既专业又高效。

2.3 技能间的协作与覆盖机制

技能不是孤岛。项目特别强调技能是“原子化但相互引用”的单元。一个常见的协作模式是: golang-error-handling 定义了错误值应包含堆栈信息,而 golang-observability 技能在指导如何记录错误日志时,会直接引用这个规范,确保日志中能捕获到完整的错误链。

更强大的是它的 覆盖机制 。对于标记为 ⚙️ Overridable 的技能(如 golang-naming , golang-code-style ),团队可以创建自己的公司级技能。只需在新技能文件的顶部明确声明:“本技能为[公司名]项目覆盖 samber/cc-skills-golang@golang-naming 技能。” AI助手在遇到命名约定冲突时,会优先采用你自定义的规则。这完美平衡了社区通用标准与团队内部特殊规范的需求。

3. 核心技能模块深度解析

samber/cc-skills-golang 的技能表涵盖了Go开发的方方面面。我们可以将其分为三大类: 通用基础技能 专项领域技能 工具库集成技能 。理解每一类技能的内涵,是有效使用它们的关键。

3.1 通用基础技能:构建代码的基石

这类技能定义了Go代码的“气质”和基本素养,是几乎所有项目都需要的。

  • golang-code-style golang-naming :这是代码的“门面”。它们不仅包含了 gofmt goimports 的格式化规则,更重要的是定义了那些工具无法自动完成的约定。例如:

    • 命名长度与上下文 :局部变量在短作用域内可以用短名( i ),但包级导出函数必须具有描述性。 golang-naming 技能会具体指导何时用 ctx ,何时必须写全 context
    • 接口命名哲学 :是 Doer 还是 Interface 结尾?技能会建议遵循Go标准库的惯例(如 Reader , Writer ),并解释其背后的“行为契约”思想。
    • 错误命名 :错误变量应命名为 ErrXxx (如 ErrNotFound ),而布尔变量检查是否发生错误应命名为 hasErr isInvalid ,避免歧义。

    实操心得 :很多团队会直接启用 golangci-lint 并认为万事大吉。但linter主要检查语法和简单语义,而这两个技能灌输的是“代码可读性”的审美和逻辑。AI在生成一个 for 循环时,如果加载了这些技能,它会主动建议将复杂的循环条件抽成命名清晰的布尔变量或函数,这是linter做不到的“智能建议”。

  • golang-error-handling :Go的错误处理是哲学,也是工程。这个技能远不止于“检查err”。

    • 错误包装与溯源 :强制要求使用 fmt.Errorf 配合 %w 动词进行错误包装,并建议集成像 pkg/errors (或Go 1.13+的 errors 包)来添加堆栈信息。它会指导AI生成类似 return fmt.Errorf("failed to query user %d: %w", userID, err) 的代码。
    • Sentinel Errors vs. Error Types :明确区分何时定义导出的哨兵错误( var ErrNotFound = errors.New("not found") )用于精确比较,何时定义自定义错误类型( type ValidationError struct {...} )用于携带结构化信息。
    • 错误处理位置 :一个关键原则是“在能够处理错误的地方处理它,否则将它清晰地传播出去”。技能会阻止AI生成在多层嵌套后简单打印日志却返回 nil 的代码,而是要求将错误向上传递或进行适当的转换。
  • golang-concurrency golang-context :这是Go的杀手锏,也是最容易出错的地方。

    • golang-concurrency :核心是安全地共享内存。它会指导AI正确使用 sync.Mutex sync.RWMutex ,并强调 defer mu.Unlock() 的重要性。对于高级模式,如使用 sync.Pool 减少GC压力、使用 atomic 操作进行无锁编程,技能会提供具体的代码模式和适用场景。
    • golang-context :技能会强制要求在所有可能阻塞的函数调用中传递 context.Context 参数,以实现超时、取消和值传递。它会给出清晰的模式: func (s *Service) Process(ctx context.Context, req *Request) (*Response, error) 。更重要的是,它会教导AI如何正确地从 ctx 中派生子上下文( context.WithTimeout , context.WithCancel ),并在goroutine中监听 ctx.Done() 以实现优雅的取消。

3.2 专项领域技能:应对生产环境的挑战

当你的项目从Demo走向生产,这些技能就变得至关重要。

  • golang-database :这不仅仅是写SQL。技能会灌输以下生产级实践:

    • 永远使用参数化查询 :指导AI生成 db.ExecContext(ctx, "INSERT INTO users(name, email) VALUES (?, ?)", name, email) ,并严厉禁止任何形式的字符串拼接SQL。
    • 连接池配置 :指导设置合理的 SetMaxOpenConns , SetMaxIdleConns , SetConnMaxLifetime ,并解释每个参数对数据库负载和应用程序性能的影响。
    • 事务处理 :提供标准的事务模板,包括错误处理、回滚和上下文传播。例如,它会建议使用闭包来确保事务的正确提交或回滚。
    // AI在技能指导下可能生成的代码模式
    err = s.db.Transaction(ctx, func(tx *sql.Tx) error {
        result, err := tx.ExecContext(ctx, query1, args1...)
        if err != nil {
            return fmt.Errorf("exec query1: %w", err)
        }
        // ... 更多操作
        return nil // 返回nil则提交,返回错误则回滚
    })
    
  • golang-observability :现代可观测性的三大支柱:日志(Logging)、指标(Metrics)、追踪(Tracing)。这个技能会指导AI如何结构化地实现它们。

    • 结构化日志 :使用 slog zap ,每个日志条目都包含 trace_id span_id user_id 等上下文字段。技能会禁止使用 fmt.Printf 或非结构化的 log.Println
    • 指标埋点 :指导在关键路径(如HTTP端点、数据库调用)使用Prometheus客户端库增加计数器(Counter)、直方图(Histogram)。例如,为每个API端点自动添加请求耗时和状态的指标。
    • 分布式追踪集成 :指导如何从传入的HTTP请求中提取或生成追踪ID,并将其注入到上下文和所有下游调用(数据库、外部API)中。
  • golang-security :这个技能将安全左移到了编码阶段。其内容提炼自Bearer(SAST)等静态分析工具的核心检查清单,但以“预防性建议”的形式呈现。

    • 输入验证与净化 :对所有用户输入进行严格的类型、长度、格式检查。指导使用 net/mail.ParseAddress 验证邮箱,使用正则表达式或专用库验证其他复杂输入。
    • 密码学安全 :强制使用 crypto/rand 生成随机数,禁止使用 math/rand ;指导正确使用 bcrypt argon2id 进行密码哈希。
    • 依赖安全 :提醒定期运行 go list -u -m all govulncheck 来检查依赖项中的已知漏洞。

3.3 工具库集成技能:拥抱高效的生态系统

Go拥有丰富的第三方库生态。这些技能帮助AI助手理解并正确使用特定的流行库。

  • golang-samber-* 系列 :这是作者Samber维护的一系列实用库的技能包。例如:
    • golang-samber-lo :指导如何用函数式风格优雅地处理切片和映射,替代冗长的 for 循环。AI会学会生成 lo.Filter(users, func(u User, _ int) bool { return u.Active }) 这样的代码。
    • golang-samber-oops :这是一个错误包装库的技能。它会指导AI用 oops.Wrapf(err, "failed to process user") 来替代原生的 fmt.Errorf ,以自动捕获堆栈和上下文信息。
    • golang-stretchr-testify :这是最流行的测试断言库的技能。它会指导AI写出更清晰、更强大的测试断言,如 assert.Equal(t, expected, actual) require.NoError(t, err) ,并解释 assert require 在测试失败时行为的不同(是否继续执行)。

注意事项 :工具库技能具有时效性。虽然这些技能会尽力涵盖库的主流用法,但库本身会更新。在启用这类技能时,最好结合官方文档一起使用。技能的价值在于提供“最佳实践模式”,而不是替代文档。

4. 实战集成:如何为你的AI助手安装与配置技能

理论再好,也需要落地。 cc-skills-golang 支持几乎所有主流的AI编程助手。下面我将以最常用的几种工具为例,详细说明安装和配置流程,并分享一些调优技巧。

4.1 通用安装方法:使用Skills CLI

这是最推荐的方式,因为它与工具无关,并且由 agentskills.io 社区维护,兼容性最好。

  1. 安装Skills CLI :这是一个Node.js工具,通过npm或yarn即可安装。

    npm install -g @agentskills/cli
    # 或
    yarn global add @agentskills/cli
    
  2. 安装全部Go技能 :运行以下命令,CLI会自动识别你的系统上安装了哪些AI助手(如Cursor、Claude Code等),并将技能包安装到对应的发现目录。

    npx skills add https://github.com/samber/cc-skills-golang --all
    

    这个过程会克隆仓库,并可能在你本地的 ~/.cursor/skills/ ~/.config/Claude/skills/ 等目录创建软链接或直接复制文件。

  3. 安装单个技能 :如果你只想尝试某个特定技能(比如先专注于改善错误处理),可以使用 --skill 参数。

    npx skills add https://github.com/samber/cc-skills-golang --skill golang-error-handling
    

4.2 针对特定IDE/工具的安装

不同的AI助手可能有细微的路径差异。以下是针对几个流行工具的“手动”安装方法,当通用CLI不奏效时可以参考。

  • Cursor : Cursor会自动从两个目录发现技能:项目根目录下的 .cursor/skills/ 和用户主目录下的 ~/.cursor/skills/ 。对于团队项目,建议将技能库作为git子模块放在项目内;对于个人全局使用,可以克隆到用户目录。

    # 全局安装(所有项目生效)
    git clone https://github.com/samber/cc-skills-golang.git ~/.cursor/skills/cc-skills-golang
    # 项目内安装(仅当前项目生效)
    git submodule add https://github.com/samber/cc-skills-golang.git .cursor/skills/cc-skills-golang
    
  • Claude Code (Desktop App) : Claude Code通常通过其插件市场安装。你可以在App内搜索“samber/cc”找到技能包集合。或者,你也可以手动将技能放置在其技能发现路径下(通常是 ~/.config/Claude/skills/ ~/.agents/skills/ )。

    git clone https://github.com/samber/cc-skills-golang.git ~/.config/Claude/skills/cc-skills-golang
    
  • GitHub Copilot (Neovim/VSCode 等编辑器插件) : Copilot的技能发现机制因编辑器而异。对于VSCode,通常需要安装专门的“Copilot Skills”扩展,并通过其界面管理。通用的方法仍然是使用Skills CLI,它通常能正确配置。手动方式可以尝试克隆到 ~/.copilot/skills/ 目录。

4.3 验证与调优技能触发

安装完成后,如何知道技能生效了?

  1. 验证加载 :在你的AI助手聊天框或命令面板中,尝试输入一些与技能相关的描述。例如,在Cursor中,你可以用 / 命令触发技能列表,或者直接开始编写Go代码。当你输入 // Create a new HTTP server with graceful shutdown 这样的注释时,观察AI生成的代码是否包含了 http.Server context signal.Notify 等符合技能规范的组件。

  2. 调整触发精度 :如果某个技能触发过于频繁(干扰了无关的编码)或从不触发,你需要调整技能的“描述”。每个技能的 SKILL.md 文件顶部都有一个YAML Frontmatter,其中的 description 字段就是触发器。

    ---
    description: "Guidelines for writing idiomatic, secure, and observable database access code in Go (SQL drivers, connection pooling, transactions, error handling, context propagation)."
    ---
    

    你可以fork这个仓库,修改这个描述文本,使其更精确或更宽泛。例如,如果 golang-performance 技能在你写业务逻辑时也总跳出来建议用 sync.Pool ,你可以将描述从“高性能Go代码”改为“优化CPU密集型或内存分配敏感的热点路径代码”。

  3. 理解技能标志 :技能表中的Flags图标提供了重要信息:

    • ⚡ Command available :该技能可以通过特定的聊天命令手动触发(例如,在Cursor中可能通过 /skill golang-testing 调用)。
    • 🧠 Ultrathink automatically :该技能包含的知识可能会被AI在“深度思考”模式下自动调用,用于解决复杂问题。
    • ⚙️ Overridable :该技能可以被你自定义的团队技能覆盖。

5. 将技能融入团队工作流与高级用法

5.1 创建团队专属技能包

cc-skills-golang 提供的是社区通用最佳实践。但每个团队都有自己独特的约定:也许你们公司要求所有的错误变量名以 Err 开头 而不是结尾,或者有自己的一套日志字段规范。

  1. 建立团队技能仓库 :在内部Git服务器(如GitLab, Gitea)或GitHub私有仓库中,创建一个新的技能仓库,例如 company-xyz/go-skills

  2. 创建覆盖技能 :假设你要覆盖命名规范。在你的仓库中创建 company-golang-naming/SKILL.md 文件。

    ---
    description: "Naming conventions for Go code at Company XYZ. This skill supersedes samber/cc-skills-golang@golang-naming skill for Company XYZ projects."
    ---
    # Company XYZ Go Naming Conventions
    
    This document defines the naming standards for all Go projects at Company XYZ.
    
    ## Overrides to Community Standards
    *   **Error Variables**: Must be prefixed with `Err` (e.g., `ErrUserNotFound`, `ErrInvalidInput`). This overrides the common suffix convention.
    *   **Interface Names**: For interfaces defining a single method, use `Xxxable` suffix (e.g., `Serializable`, `Readable`). For multi-method interfaces, use `Xxxer` suffix (e.g., `RequestHandler`, `DataProcessor`).
    *   **Package Names**: All internal packages must be under `internal/` directory. Package names should be singular (e.g., `internal/user`, not `internal/users`).
    
    ## References
    *   [Internal Logging Standard](./references/logging.md)
    *   [API Error Response Format](./references/api-errors.md)
    

    注意开头的声明语句,它明确告诉AI此技能优先级更高。

  3. 安装团队技能 :让你的团队成员通过Skills CLI或手动方式,同时安装社区技能包和团队技能包。AI助手会智能地合并和解决冲突,优先采用团队技能中的规则。

5.2 在CI/CD中集成技能验证

你可以将技能库中的核心规则提取出来,集成到团队的持续集成流水线中,作为代码审查的自动化补充。

  1. 提取规则为Linter :许多技能中的规范(特别是 golang-code-style , golang-naming , golang-error-handling 中的部分规则)可以通过自定义的 golangci-lint 规则或 revive 规则来实现。例如,你可以写一个检查器,确保所有导出的错误变量都符合 ErrXxx 格式。

  2. 创建预提交钩子 :利用 pre-commit 框架,创建一个钩子,在提交前运行这些自定义的linter,确保代码符合团队技能定义的规范。

  3. 在PR描述中引用技能 :鼓励开发者在提交Pull Request时,在描述中说明本次更改遵循或涉及了哪个技能(如“遵循了 golang-concurrency 技能中关于Mutex使用的建议”)。这可以作为代码审查的检查清单,提升审查效率和质量。

5.3 应对技能冲突与上下文管理

当你启用了大量技能时,极少数情况下可能会遇到技能建议冲突,或者感觉AI响应变慢(可能因为加载了过多的上下文)。

  • 解决冲突 :技能设计时已尽量避免重叠。如果遇到冲突(例如两个技能对同一段代码给出了相反的建议),首先检查技能的 description When to use 部分,看哪个技能更符合当前上下文。通常,更具体的技能会覆盖更通用的建议。如果问题持续,可以考虑暂时禁用其中一个技能,或像前面提到的,创建覆盖技能来明确规则。

  • 管理上下文负载 :如果你发现AI的响应速度下降或质量不稳定,可能是同时激活了太多技能的完整内容。回顾一下,技能的核心描述层加载开销很小(~1.1K令牌),问题通常出在动态加载的 SKILL.md references 上。你可以:

    1. 检查AI助手的设置,看是否有“上下文管理”或“记忆”相关的选项,限制单次加载的额外上下文大小。
    2. 对于非常庞大的项目,考虑只启用当前开发阶段最核心的技能(如先启用 golang-code-style , golang-error-handling , golang-testing ),等需要深入性能调优或安全审计时再启用 golang-performance golang-security

6. 常见问题与排查技巧实录

在实际使用 cc-skills-golang 的过程中,你可能会遇到一些典型问题。下面是我根据经验整理的排查清单。

问题现象 可能原因 解决方案
AI完全不理会技能建议 1. 技能未正确安装到AI助手的发现路径。
2. AI助手未启用或未正确配置技能插件功能。
3. 当前编辑的文件类型未被识别为Go项目。
1. 运行 npx skills list 查看已安装技能。使用 npx skills doctor 检查路径配置。
2. 检查AI助手设置,确保“Skills”、“Plugins”或“Extensions”功能已开启。
3. 确保文件以 .go 结尾,或项目根目录有 go.mod 文件。在项目根目录创建一个 .cursor/skills/ .agents/skills/ 文件夹并重新安装技能。
技能触发过于频繁或无关 技能的 description 字段定义过于宽泛,匹配了太多不相关的编码场景。 定位到该技能的 SKILL.md 文件,修改其YAML头中的 description ,使其描述更精确、场景更具体。例如,将“处理错误”改为“在Go函数中返回和包装错误”。
技能建议互相矛盾 1. 同时启用了具有重叠领域的技能(虽经设计尽量避免,但边缘情况可能存在)。
2. 团队自定义技能与社区技能冲突。
1. 仔细阅读冲突技能的主文档,通常其中一个会声明更具体的适用范围。遵循更具体的那个。
2. 确保你的团队技能在开头明确声明了覆盖关系( This skill supersedes... )。AI会优先采用声明了覆盖关系的技能。
AI生成的代码符合技能A,但违反了技能B 技能是原子化的,AI可能在同一轮对话中只激活了部分相关技能。 这是一个提示工程问题。在你的请求或代码注释中,可以更明确地指定需要综合考量的技能。例如,写注释: // 请综合考虑golang-error-handling和golang-observability技能,实现这个函数。
技能更新后,AI行为未改变 AI助手缓存了旧的技能内容。 1. 重启你的AI助手应用(如Cursor、Claude Code)。
2. 如果手动克隆仓库,进入技能目录执行 git pull 拉取最新更新。
3. 使用Skills CLI的更新命令: npx skills update cc-skills-golang
使用Skills CLI安装失败 网络问题,或Node.js环境问题,或权限问题。 1. 检查网络连接,尝试使用镜像源: npx --registry=https://registry.npmmirror.com skills add ...
2. 确保Node.js版本在16以上。
3. 在Unix系统上,尝试用 sudo 运行(不推荐)或检查 ~/.skills 目录的写入权限。更安全的方式是修改该目录权限。

独家避坑技巧

  • 从小处着手 :不要一开始就启用所有30多个技能。先从最影响代码质量的几个开始,比如 golang-error-handling , golang-code-style , golang-testing 。熟悉了AI在这些领域的提升后,再逐步添加 golang-concurrency golang-database 等更专业的技能。
  • 结合“聊天”使用 :不要只依赖自动补全。当你对某个技能的具体建议有疑问时,直接向AI助手提问。例如:“根据 golang-observability 技能,我应该如何为这个数据库查询添加追踪ID?” 这能帮助你更深入地理解技能背后的原理,而不仅仅是复制代码。
  • 技能是助手,不是圣经 :这些技能代表的是经过验证的、普遍适用的最佳实践。但它们不能替代你的思考和项目的特殊需求。如果某个技能建议与你的架构严重不符(例如,技能建议使用某个特定的DI框架,而你的项目用的是另一个),你应该相信自己的判断,或者创建覆盖技能来定义你自己的规范。

更多推荐