Install any skill in seconds. Free to start, no credit card required.
Get Started Free →GoFrame development skill. TRIGGER when writing/modifying Go files, implementing services, creating APIs, or database operations. DO NOT TRIGGER for frontend/shell scripts.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 79% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 14% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -3% | 0% |
gf init to create project scaffolding. See Project Creation - init for details.logic/ directory for business logic. Implement business logic directly in the service/ directory.gerror component for all error handling to ensure complete stack traces for traceability.internal/model/do/), never g.Map or map[string]interface{}. DO struct fields are interface{}; unset fields remain nil and are automatically ignored by the ORM:go // Good - use DO object dao.Users.Ctx(ctx).Where(cols.Id, id).Data(do.User{Uid: uid}).Update()
// Good - conditional fields, unset fields are nil and ignored data := do.User{} if password != "" { data.PasswordHash = hash } if isAdmin != nil { data.IsAdmin = isAdmin } dao.Users.Ctx(ctx).Where(cols.Id, id).Data(data).Update()
// Good - explicitly set a column to NULL using gdb.Raw dao.Instances.Ctx(ctx).Where(cols.Id, id).Data(do.Instance{IdleSince: gdb.Raw("NULL")}).Update()
// Bad - never use g.Map for database operations dao.Users.Ctx(ctx).Data(g.Map{cols.Uid: uid}).Update()
var block to group them for better alignment and readability:go // Good - aligned and clean var ( authSvc auth.Service bizCtxSvc bizctx.Service k8sSvc svcK8s.Service notebookSvc notebook.Service middlewareSvc middleware.Service )
// Avoid - scattered declarations authSvc := auth.New() bizCtxSvc := bizctx.New() k8sSvc := svcK8s.New()
GoFrame provides automatic soft delete and time maintenance features. When a table contains created_at, updated_at, or deleted_at fields, the ORM handles these automatically.
| Field | Auto Behavior | |-------|---------------| | created_at | Auto-written on Insert/InsertAndGetId, never modified afterward | | updated_at | Auto-written on Insert/Update/Save | | deleted_at | Auto-written on Delete (soft delete), auto-filtered on queries |
1. NEVER manually set time fields - GoFrame handles these automatically:
go// WRONG - redundant manual time setting dao.User.Ctx(ctx).Data(do.User{ Name: "john", CreatedAt: gtime.Now(), // REDUNDANT! Framework handles this UpdatedAt: gtime.Now(), // REDUNDANT! Framework handles this }).Insert() // CORRECT - let framework handle time fields dao.User.Ctx(ctx).Data(do.User{ Name: "john", }).Insert()
2. NEVER manually add WhereNull(cols.DeletedAt) - GoFrame auto-adds soft delete filter:
go// WRONG - redundant soft delete condition dao.User.Ctx(ctx). Where(do.User{Status: 1}). WhereNull(cols.DeletedAt). // REDUNDANT! Framework auto-adds this Scan(&list) // CORRECT - framework auto-adds deleted_at IS NULL dao.User.Ctx(ctx). Where(do.User{Status: 1}). Scan(&list)
3. Use Delete() for soft delete - Framework converts to UPDATE SET deleted_at = NOW():
go// CORRECT - use Delete(), framework handles soft delete dao.User.Ctx(ctx).Where(do.User{Id: id}).Delete() // Actual SQL: UPDATE `sys_user` SET `deleted_at`=NOW() WHERE `id`=? // WRONG - manual Update with deleted_at dao.User.Ctx(ctx). Where(do.User{Id: id}). Data(do.User{DeletedAt: gtime.Now()}). // REDUNDANT! Update()
The deleted_at field supports multiple types:
Time field names can be customized in config.yaml:
yamldatabase: default: createdAt: "created_at" # Custom field name updatedAt: "updated_at" deletedAt: "deleted_at" timeMaintainDisabled: false # Set true to disable this feature
Complete GoFrame development resources covering component design, usage, best practices, and considerations: GoFrame Documentation
Rich practical code examples covering HTTP services, gRPC services, and various project types: GoFrame Examples
Other measured skills in the registry, with their headline benchmark lift.