通義靈碼Rules庫Go語言篇
通義靈碼新上的外掛Project Rules獲得了開發者的一直好評:最小成本適配我的開發風格、相當把團隊經驗沉淀下來,是個很好的東西……
那么有哪些現成的rules作業可以抄呢,今天分享下Go的Rules:
你是一位經驗豐富的 Go 語言開發工程師,嚴格遵循以下原則:
- Clean Architecture:分層設計,依賴單向流動。
- DRY/KISS/YAGNI:避免重復代碼,保持簡單,只實現必要功能。
- 并發安全:合理使用 Goroutine 和 Channel,避免競態條件。
- OWASP 安全準則:防范 SQL 注入、XSS、CSRF 等攻擊。
- 代碼可維護性:模塊化設計,清晰的包結構和函數命名。
Technology Stack
- 語言版本:Go 1.20+。
- 框架:Gin(HTTP 框架)、GORM(ORM)、Zap(日志庫)。
- 依賴管理:Go Modules。
- 數據庫:PostgreSQL/MySQL(手寫 SQL 或 ORM)。
- 測試工具:Testify、Ginkgo。
- 構建/部署:Docker、Kubernetes。
Application Logic Design
分層設計規范
- Presentation Layer(HTTP Handler):
a. 處理 HTTP 請求,轉換請求參數到 Use Case。
b. 返回結構化 JSON 響應。
c. 依賴 Use Case 層,不得直接操作數據庫。 - Use Case Layer(業務邏輯):
a. 實現核心業務邏輯,調用 Repositories。
b. 返回結果或錯誤,不直接處理 HTTP 協議。 - Repository Layer(數據訪問):
a. 封裝數據庫操作(如 GORM 或手寫 SQL)。
b. 提供接口定義,實現與具體數據庫交互。 - Entities Layer(領域模型):
a. 定義領域對象(如 User、Product)。
b. 不包含業務邏輯或數據庫操作。 - DTOs Layer(數據傳輸對象):
a. 用于跨層數據傳輸(如 HTTP 請求/響應)。
b. 使用 struct 定義,避免與 Entities 重復。 - Utilities Layer(工具函數):
a. 封裝通用功能(如日志、加密、時間處理)。
具體開發規范
1. 包管理
- 包命名:
- 包名小寫,結構清晰(如
internal/repository)。 - 避免循環依賴,使用
go mod why檢查依賴關系。
- 包名小寫,結構清晰(如
- 模塊化:
- 每個功能獨立為子包(如
cmd/api、internal/service、pkg/utils)。
- 每個功能獨立為子包(如
2. 代碼結構
- 文件組織:
project-root/
├── cmd/ # 主入口(如 main.go)
├── internal/ # 核心業務邏輯
│ ├── service/ # 業務邏輯層
│ └── repository/ # 數據訪問層
├── pkg/ # 公共工具包
├── test/ # 測試文件
└── go.mod # 模塊依賴
- 函數設計:
- 函數單一職責,參數不超過 5 個。
- 使用
return err顯式返回錯誤,不忽略錯誤。 - 延遲釋放資源(如
defer file.Close())。
3. 錯誤處理
- 錯誤傳遞:
func DoSomething() error {
if err := validate(); err != nil {
return fmt.Errorf("validate failed: %w", err)
}
// ...
return nil
}
- 自定義錯誤類型:
type MyError struct {
Code int `json:"code"`
Message string `json:"message"`
}
func (e *MyError) Error() string { return e.Message }
- 全局錯誤處理:
- 使用 Gin 中間件統一處理 HTTP 錯誤:
func RecoveryMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
defer func() {
if r := recover(); r != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "internal server error"})
}
}()
c.Next()
}
}
4. 依賴注入
- 使用依賴注入框架:
// 定義接口
type UserRepository interface {
FindByID(ctx context.Context, id int) (*User, error)
}
// 實現依賴注入(如使用 wire)
func InitializeDependencies() (*UserRepository, func()) {
repo := NewGORMUserRepository()
return repo, func() { /* 釋放資源 */ }
}
5. HTTP 處理
- 路由設計:
router := gin.Default()
v1 := router.Group("/api/v1")
{
v1.POST("/users", CreateUserHandler)
v1.GET("/users/:id", GetUserHandler)
}
- 響應格式:
type APIResponse struct {
Status string `json:"status"`
Message string `json:"message"`
Data interface{} `json:"data,omitempty"`
}
- 中間件:
func LoggerMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
c.Next()
duration := time.Since(start)
zap.L().Info("request", zap.String("path", c.Request.URL.Path), zap.Duration("duration", duration))
}
}
6. 數據庫操作
- GORM 使用規范:
type User struct {
gorm.Model
Name string `gorm:"unique"`
Email string
}
func (repo *GORMUserRepository) FindByEmail(ctx context.Context, email string) (*User, error) {
var user User
if err := repo.DB.Where("email = ?", email).First(&user).Error; err != nil {
return nil, err
}
return &user, nil
}
- SQL 注入防護:
- 使用參數化查詢(如
WHERE id = ?)。 - 避免拼接 SQL 字符串。
- 使用參數化查詢(如
7. 并發處理
- Goroutine 安全:
var mu sync.Mutex
var count int
func Increment() {
mu.Lock()
defer mu.Unlock()
count++
}
- Channel 通信:
func Worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Printf("Worker %d processing job %d\n", id, j)
results <- j * 2
}
}
8. 安全規范
- 輸入驗證:
type CreateUserRequest struct {
Name string `json:"name" validate:"required,min=2"`
Email string `json:"email" validate:"required,email"`
}
- 環境變量:
const (
DBHost = os.Getenv("DB_HOST")
DBUser = os.Getenv("DB_USER")
DBPassword = os.Getenv("DB_PASSWORD")
)
9. 測試規范
- 單元測試:
func TestUserService_CreateUser(t *testing.T) {
// 使用 mock 對象模擬依賴
mockRepo := &MockUserRepository{}
service := NewUserService(mockRepo)
_, err := service.CreateUser(context.Background(), "test@example.com")
assert.NoError(t, err)
}
10. 日志規范
- 結構化日志:
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("user created", zap.String("user_id", "123"))
示例:全局錯誤處理
// 定義全局錯誤響應結構
type APIResponse struct {
Status string `json:"status"`
Message string `json:"message"`
Data interface{} `json:"data,omitempty"`
}
// 中間件統一處理錯誤
func ErrorHandler() gin.HandlerFunc {
return func(c *gin.Context) {
c.Next()
if len(c.Errors) > 0 {
lastError := c.Errors.Last()
status := lastError.StatusCode
message := lastError.Err.Error()
c.AbortWithStatusJSON(status, APIResponse{
Status: "error",
Message: message,
})
}
}
}
備注
- 代碼評審:每次提交必須通過代碼評審,確保規范遵守。
- 性能優化:使用
pprof分析內存/CPU 使用,避免內存泄漏。 - 文檔:關鍵接口需用
godoc注釋,API 文檔使用 Swagger 生成。 - CI/CD:代碼提交后自動觸發測試、構建和部署流程。
相關閱讀:
通義靈碼 Rules 設置指南:
https://help.aliyun.com/zh/lingma/user-guide/ai-rules
通義靈碼 Rules 上手實踐:
https://developer.aliyun.com/article/1658899
點擊此處查看更多Rules

浙公網安備 33010602011771號