Go项目AI编程助手技能包:提升代码质量与开发效率
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的数据库操作规范),并且被设计为可以与其他技能组合使用。
这种设计带来了几个根本性优势:
- 关注点分离 :将庞大的Go知识体系分解为
golang-code-style(代码风格)、golang-testing(测试)、golang-security(安全)等独立模块。开发者或团队可以根据项目需要,选择性地启用部分技能,而不是被迫接受一个“全能但臃肿”的单一提示。 - 一致性保证 :技能内部的定义是统一的。例如,
golang-error-handling技能会明确规定错误应该被包装、记录,并且永远不要返回裸的errors.New。当golang-observability技能被触发时,它会引用相同的错误处理规范来确保日志和追踪信息的一致性。这种跨技能的引用机制,避免了不同建议之间的冲突。 - 可维护性 :当Go语言发布新特性(比如泛型)或社区出现新的最佳实践时,你只需要更新对应的技能模块(如
golang-modernize),而无需重写整个庞大的提示词库。这就像更新一个软件库,而不是重写整个应用程序。
2.2 动态加载与上下文经济
AI模型(如Claude、GPT)的上下文窗口是有限的宝贵资源。把一整本Go编程规范塞进上下文,不仅会挤占分析当前代码所需的空间,还可能因为信息过载导致模型输出质量下降。 cc-skills-golang 通过精巧的三层结构解决了这个问题:
-
技能描述层(Description) :这是每个技能YAML头文件里的一个简短摘要,通常只有几十到一百多个令牌(Token)。 这部分内容会在AI助手启动时被预加载 。它的作用就像一个“索引”或“触发器”,告诉AI:“我这里有一个关于Go错误处理的技能,当你看到用户代码中出现了
if err != nil这类模式时,可以考虑激活我。” 所有技能的描述加起来,在项目启动时也只占用约1.1K令牌,成本极低。 -
核心知识层(SKILL.md) :这是技能的主文件,包含该领域最核心、最常用的规则和示例,大小控制在1K-2.5K令牌。 只有当AI根据描述层判断当前任务与该技能高度相关时,才会动态加载这个文件 。例如,用户开始编写一个数据库查询函数,AI就会加载
golang-database技能的SKILL.md文件,获取关于SQL注入防护、连接池管理、上下文超时等具体建议。 -
深度参考层(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则提交,返回错误则回滚 }) - 永远使用参数化查询 :指导AI生成
-
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 社区维护,兼容性最好。
-
安装Skills CLI :这是一个Node.js工具,通过npm或yarn即可安装。
npm install -g @agentskills/cli # 或 yarn global add @agentskills/cli -
安装全部Go技能 :运行以下命令,CLI会自动识别你的系统上安装了哪些AI助手(如Cursor、Claude Code等),并将技能包安装到对应的发现目录。
npx skills add https://github.com/samber/cc-skills-golang --all这个过程会克隆仓库,并可能在你本地的
~/.cursor/skills/、~/.config/Claude/skills/等目录创建软链接或直接复制文件。 -
安装单个技能 :如果你只想尝试某个特定技能(比如先专注于改善错误处理),可以使用
--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 验证与调优技能触发
安装完成后,如何知道技能生效了?
-
验证加载 :在你的AI助手聊天框或命令面板中,尝试输入一些与技能相关的描述。例如,在Cursor中,你可以用
/命令触发技能列表,或者直接开始编写Go代码。当你输入// Create a new HTTP server with graceful shutdown这样的注释时,观察AI生成的代码是否包含了http.Server、context、signal.Notify等符合技能规范的组件。 -
调整触发精度 :如果某个技能触发过于频繁(干扰了无关的编码)或从不触发,你需要调整技能的“描述”。每个技能的
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密集型或内存分配敏感的热点路径代码”。 -
理解技能标志 :技能表中的Flags图标提供了重要信息:
⚡ Command available:该技能可以通过特定的聊天命令手动触发(例如,在Cursor中可能通过/skill golang-testing调用)。🧠 Ultrathink automatically:该技能包含的知识可能会被AI在“深度思考”模式下自动调用,用于解决复杂问题。⚙️ Overridable:该技能可以被你自定义的团队技能覆盖。
5. 将技能融入团队工作流与高级用法
5.1 创建团队专属技能包
cc-skills-golang 提供的是社区通用最佳实践。但每个团队都有自己独特的约定:也许你们公司要求所有的错误变量名以 Err 开头 而不是结尾,或者有自己的一套日志字段规范。
-
建立团队技能仓库 :在内部Git服务器(如GitLab, Gitea)或GitHub私有仓库中,创建一个新的技能仓库,例如
company-xyz/go-skills。 -
创建覆盖技能 :假设你要覆盖命名规范。在你的仓库中创建
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此技能优先级更高。
-
安装团队技能 :让你的团队成员通过Skills CLI或手动方式,同时安装社区技能包和团队技能包。AI助手会智能地合并和解决冲突,优先采用团队技能中的规则。
5.2 在CI/CD中集成技能验证
你可以将技能库中的核心规则提取出来,集成到团队的持续集成流水线中,作为代码审查的自动化补充。
-
提取规则为Linter :许多技能中的规范(特别是
golang-code-style,golang-naming,golang-error-handling中的部分规则)可以通过自定义的golangci-lint规则或revive规则来实现。例如,你可以写一个检查器,确保所有导出的错误变量都符合ErrXxx格式。 -
创建预提交钩子 :利用
pre-commit框架,创建一个钩子,在提交前运行这些自定义的linter,确保代码符合团队技能定义的规范。 -
在PR描述中引用技能 :鼓励开发者在提交Pull Request时,在描述中说明本次更改遵循或涉及了哪个技能(如“遵循了
golang-concurrency技能中关于Mutex使用的建议”)。这可以作为代码审查的检查清单,提升审查效率和质量。
5.3 应对技能冲突与上下文管理
当你启用了大量技能时,极少数情况下可能会遇到技能建议冲突,或者感觉AI响应变慢(可能因为加载了过多的上下文)。
-
解决冲突 :技能设计时已尽量避免重叠。如果遇到冲突(例如两个技能对同一段代码给出了相反的建议),首先检查技能的
description和When to use部分,看哪个技能更符合当前上下文。通常,更具体的技能会覆盖更通用的建议。如果问题持续,可以考虑暂时禁用其中一个技能,或像前面提到的,创建覆盖技能来明确规则。 -
管理上下文负载 :如果你发现AI的响应速度下降或质量不稳定,可能是同时激活了太多技能的完整内容。回顾一下,技能的核心描述层加载开销很小(~1.1K令牌),问题通常出在动态加载的
SKILL.md和references上。你可以:- 检查AI助手的设置,看是否有“上下文管理”或“记忆”相关的选项,限制单次加载的额外上下文大小。
- 对于非常庞大的项目,考虑只启用当前开发阶段最核心的技能(如先启用
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框架,而你的项目用的是另一个),你应该相信自己的判断,或者创建覆盖技能来定义你自己的规范。
更多推荐

所有评论(0)