用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/microwind/ai-skills --skill go命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | Go语言模式 |
| description | 当应用Go语言设计模式时,分析并发模式,优化性能策略,解决架构问题。验证模式实现,设计系统架构,和最佳实践。 |
| license | MIT |
Go语言提供了独特的并发模型和简洁的语法结构,使得某些设计模式在Go中有着特殊的实现方式。不当的模式应用会导致代码复杂、性能低下、维护困难。在选择和实现设计模式前需要仔细分析Go语言特性。
核心原则: 好的Go模式应该简洁明了、并发安全、性能优良、易于维护。坏的Go模式会过度抽象、性能损耗、难以理解。
始终:
触发短语:
问题: Goroutine泄漏
原因: Goroutine没有正确的退出机制
解决: 使用Context控制Goroutine生命周期
问题: 数据竞争
原因: 多个Goroutine同时访问共享数据
解决: 使用Mutex或Channel进行同步
问题: 死锁
原因: 不当的锁顺序或Channel使用
解决: 遵循一致的锁获取顺序,避免循环依赖
问题: 过度使用全局变量
原因: 缺乏依赖注入意识
解决: 使用依赖注入模式管理对象生命周期
问题: 错误处理不一致
原因: 缺乏统一的错误处理策略
解决: 实现统一的错误处理模式
package singleton
import (
"sync"
)
// 单例结构体
type DatabaseConnection struct {
connection string
}
// 私有变量
var (
instance *DatabaseConnection
once sync.Once
)
// 获取单例实例
func GetDatabaseConnection() *DatabaseConnection {
once.Do(func() {
instance = &DatabaseConnection{
connection: "mysql://localhost:3306/mydb",
}
})
return instance
}
// 使用示例
func ExampleSingleton() {
db1 := GetDatabaseConnection()
db2 := GetDatabaseConnection()
// db1 和 db2 是同一个实例
println(db1 == db2) // true
}
package factory
import "fmt"
// 动物接口
type Animal interface {
Speak() string
}
// 狗实现
type Dog struct{}
func (d Dog) Speak() string {
return "汪汪"
}
// 猫实现
type Cat struct{}
func (c Cat) Speak() string {
return "喵喵"
}
// 工厂函数
func CreateAnimal(animalType string) Animal {
switch animalType {
case "dog":
return Dog{}
case "cat":
return Cat{}
default:
return nil
}
}
// 使用示例
func ExampleFactory() {
dog := CreateAnimal("dog")
cat := CreateAnimal("cat")
fmt.Println(dog.Speak()) // 汪汪
fmt.Println(cat.Speak()) // 喵喵
}
package observer
import (
"fmt"
"sync"
)
// 观察者接口
type Observer interface {
Update(data interface{})
}
// 主题接口
type Subject interface {
Register(observer Observer)
Unregister(observer Observer)
Notify(data interface{})
}
// 具体主题
type WeatherStation struct {
observers []Observer
mutex sync.RWMutex
temperature float64
}
func NewWeatherStation() *WeatherStation {
return &WeatherStation{
observers: make([]Observer, 0),
}
}
func (ws *WeatherStation) Register(observer Observer) {
ws.mutex.Lock()
defer ws.mutex.Unlock()
ws.observers = append(ws.observers, observer)
}
func (ws *WeatherStation) Unregister(observer Observer) {
ws.mutex.Lock()
defer ws.mutex.Unlock()
for i, obs := range ws.observers {
if obs == observer {
ws.observers = append(ws.observers[:i], ws.observers[i+1:]...)
break
}
}
}
func (ws *WeatherStation) Notify(data interface{}) {
ws.mutex.RLock()
defer ws.mutex.RUnlock()
for _, observer := range ws.observers {
observer.Update(data)
}
}
SetTemperature(temp ) {
ws.temperature = temp
ws.Notify(ws.temperature)
}
TemperatureDisplay {
name
}
Update(data {}) {
fmt.Printf(, td.name, data.())
}
{
station := NewWeatherStation()
display1 := TemperatureDisplay{name: }
display2 := TemperatureDisplay{name: }
station.Register(display1)
station.Register(display2)
station.SetTemperature()
}
package workerpool
import (
"fmt"
"sync"
"time"
)
// 任务接口
type Task interface {
Execute() error
}
// 具体任务
type PrintTask struct {
message string
}
func (pt PrintTask) Execute() error {
fmt.Println(pt.message)
return nil
}
// Worker Pool
type WorkerPool struct {
tasks chan Task
workers int
wg sync.WaitGroup
quit chan bool
}
func NewWorkerPool(workers int) *WorkerPool {
return &WorkerPool{
tasks: make(chan Task, workers*2),
workers: workers,
quit: make(chan bool),
}
}
func (wp *WorkerPool) Start() {
for i := 0; i < wp.workers; i++ {
wp.wg.Add(1)
go wp.worker(i)
}
}
func (wp *WorkerPool) worker(id int) {
defer wp.wg.Done()
for {
{
task := <-wp.tasks:
err := task.Execute(); err != {
fmt.Printf(, id, err)
}
<-wp.quit:
fmt.Printf(, id)
}
}
}
Submit(task Task) {
wp.tasks <- task
}
Stop() {
(wp.quit)
wp.wg.Wait()
(wp.tasks)
}
{
pool := NewWorkerPool()
pool.Start()
pool.Stop()
i := ; i < ; i++ {
task := PrintTask{message: fmt.Sprintf(, i)}
pool.Submit(task)
}
time.Sleep(time.Second)
}
package contextpattern
import (
"context"
"fmt"
"time"
)
// 长时间运行的操作
func LongRunningOperation(ctx context.Context, duration time.Duration) error {
select {
case <-time.After(duration):
fmt.Println("操作完成")
return nil
case <-ctx.Done():
fmt.Println("操作被取消:", ctx.Err())
return ctx.Err()
}
}
// 带超时的操作
func OperationWithTimeout(timeout time.Duration) error {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
return LongRunningOperation(ctx, 2*time.Second)
}
// 带取消的操作
func OperationWithCancel() error {
ctx, cancel := context.WithCancel(context.Background())
// 模拟在1秒后取消操作
go func() {
time.Sleep(1 * time.Second)
cancel()
}()
return LongRunningOperation(ctx, 5*time.Second)
}
// 使用示例
func ExampleContext() {
fmt.Println("=== 带超时的操作 ===")
err := OperationWithTimeout( * time.Second)
err != {
fmt.Println(, err)
}
fmt.Println()
err = OperationWithCancel()
err != {
fmt.Println(, err)
}
}
package errorpattern
import (
"errors"
"fmt"
)
// 自定义错误类型
type AppError struct {
Code int
Message string
Cause error
}
func (e AppError) Error() string {
if e.Cause != nil {
return fmt.Sprintf("Code: %d, Message: %s, Cause: %v",
e.Code, e.Message, e.Cause)
}
return fmt.Sprintf("Code: %d, Message: %s", e.Code, e.Message)
}
func (e AppError) Unwrap() error {
return e.Cause
}
// 错误码常量
const (
ErrCodeNotFound = 404
ErrCodeInvalidInput = 400
ErrCodeInternal = 500
)
// 创建特定错误
func NewNotFoundError(message string, cause error) error {
return AppError{
Code: ErrCodeNotFound,
Message: message,
Cause: cause,
}
}
func NewInvalidInputError(message string) error {
return AppError{
Code: ErrCodeInvalidInput,
Message: message,
}
}
// 业务逻辑
func (, ) {
id <= {
, NewInvalidInputError()
}
id == {
, NewNotFoundError(, errors.New())
}
fmt.Sprintf(, id),
}
{
err == {
}
appErr AppError
errors.As(err, &appErr) {
appErr.Code {
ErrCodeNotFound:
fmt.Printf(, appErr.Message)
ErrCodeInvalidInput:
fmt.Printf(, appErr.Message)
ErrCodeInternal:
fmt.Printf(, appErr.Message)
:
fmt.Printf(, appErr.Message)
}
} {
fmt.Printf(, err)
}
}
{
fmt.Println()
user, err := FindUser()
err != {
HandleError(err)
} {
fmt.Println(, user)
}
_, err = FindUser()
HandleError(err)
_, err = FindUser()
HandleError(err)
}
package pipeline
import (
"fmt"
"sync"
)
// 管道阶段函数类型
type PipelineFunc func(interface{}) (interface{}, error)
// 管道
type Pipeline struct {
stages []PipelineFunc
}
func NewPipeline() *Pipeline {
return &Pipeline{
stages: make([]PipelineFunc, 0),
}
}
func (p *Pipeline) AddStage(stage PipelineFunc) *Pipeline {
p.stages = append(p.stages, stage)
return p
}
func (p *Pipeline) Execute(input interface{}) (interface{}, error) {
var err error
result := input
for i, stage := range p.stages {
result, err = stage(result)
if err != nil {
return nil, fmt.Errorf("阶段 %d 执行失败: %w", i, err)
}
}
return result, nil
}
// 并发管道
type ConcurrentPipeline struct {
stages []PipelineFunc
workers int
}
func NewConcurrentPipeline *ConcurrentPipeline {
&ConcurrentPipeline{
stages: ([]PipelineFunc, ),
workers: workers,
}
}
AddStage(stage PipelineFunc) *ConcurrentPipeline {
cp.stages = (cp.stages, stage)
cp
}
Execute(inputs []{}) ([]{}, ) {
wg sync.WaitGroup
results := ([]{}, (inputs))
errors := ([], (inputs))
workChan := ( , (inputs))
i := ; i < cp.workers; i++ {
wg.Add()
{
wg.Done()
index := workChan {
result, err := cp.processInput(inputs[index])
results[index] = result
errors[index] = err
}
}()
}
i := inputs {
workChan <- i
}
(workChan)
wg.Wait()
_, err := errors {
err != {
, err
}
}
results,
}
processInput(input {}) ({}, ) {
result := input
err
_, stage := cp.stages {
result, err = stage(result)
err != {
, err
}
}
result,
}
({}, ) {
str, ok := input.()
!ok {
, fmt.Errorf()
}
str == {
, fmt.Errorf()
}
str,
}
({}, ) {
str := input.()
fmt.Sprintf(, str),
}
({}, ) {
str := input.()
fmt.Sprintf(, str),
}
{
fmt.Println()
pipeline := NewPipeline()
pipeline.AddStage(ValidateInput)
pipeline.AddStage(Transform)
pipeline.AddStage(FormatOutput)
result, err := pipeline.Execute()
err != {
fmt.Println(, err)
} {
fmt.Println(, result)
}
fmt.Println()
inputs := []{}{
, , , , ,
}
concurrentPipeline := NewConcurrentPipeline()
concurrentPipeline.AddStage(ValidateInput)
concurrentPipeline.AddStage(Transform)
concurrentPipeline.AddStage(FormatOutput)
results, err := concurrentPipeline.Execute(inputs)
err != {
fmt.Println(, err)
} {
i, result := results {
fmt.Printf(, i+, result)
}
}
}