Backend

goframe-v2

gogf/skills · updated Apr 8, 2026

$npx skills add https://github.com/gogf/skills --skill goframe-v2
summary

GoFrame v2 development conventions and component standards for Go services and APIs.

  • Use gf init to scaffold HTTP and microservice projects; auto-generated dao, do, and entity files must never be manually modified
  • Implement business logic directly in the service/ directory; avoid the logic/ directory unless explicitly required
  • Always use DO objects from internal/model/do/ for database operations; never use g.Map or map[string]interface{} , and leverage nil field handling for conditio
skill.md

Critical Conventions

Project Development Standards

  • For complete projects (HTTP/microservices), install GoFrame CLI and use gf init to create project scaffolding. See Project Creation - init for details.
  • Auto-generated code files (dao, do, entity) MUST NOT be manually created or modified per GoFrame conventions.
  • Unless explicitly requested, do NOT use the logic/ directory for business logic. Implement business logic directly in the service/ directory.
  • Reference complete project examples:

Component Usage Standards

  • Before creating new methods or variables, check if they already exist elsewhere and reuse existing implementations.
  • Use the gerror component for all error handling to ensure complete stack traces for traceability.
  • When exploring new components, prioritize GoFrame built-in components and reference best practice code from examples.
  • Database Operations MUST use DO objects (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:
    // 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()
    

Code Style Standards

  • Variable Declarations: When defining multiple variables, use a var block to group them for better alignment and readability:
    // 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()
    
  • Apply this pattern when you have 3 or more related variable declarations in the same scope.

Soft Delete & Time Maintenance

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.

Automatic Time Fields

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

Critical Rules

1. NEVER manually set time fields - GoFrame handles these automatically:

// 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:

// 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():

// 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()

Field Type Support

The deleted_at field supports multiple types:

  • DateTime/Timestamp: Default, stores deletion time
  • Integer: Stores Unix timestamp (seconds)
  • Boolean: Stores 0/1 for deleted state

Configuration (Optional)

Time field names can be customized in config.yaml:

database:
  default:
    createdAt: "created_at"   # Custom field name
    updatedAt: "updated_at"
    deletedAt: "deleted_at"
    timeMaintainDisabled: false  # Set true to disable this feature

GoFrame Documentation

Complete GoFrame development resources covering component design, usage, best practices, and considerations: GoFrame Documentation

GoFrame Code Examples

Rich practical code examples covering HTTP services, gRPC services, and various project types: GoFrame Examples

general reviews

Ratings

4.671 reviews
  • Shikha Mishra· Dec 24, 2024

    Registry listing for goframe-v2 matched our evaluation — installs cleanly and behaves as described in the markdown.

  • Ganesh Mohane· Dec 20, 2024

    goframe-v2 has been reliable in day-to-day use. Documentation quality is above average for community skills.

  • Ira Tandon· Dec 16, 2024

    Keeps context tight: goframe-v2 is the kind of skill you can hand to a new teammate without a long onboarding doc.

  • William Huang· Dec 16, 2024

    goframe-v2 has been reliable in day-to-day use. Documentation quality is above average for community skills.

  • Luis Thomas· Dec 16, 2024

    goframe-v2 reduced setup friction for our internal harness; good balance of opinion and flexibility.

  • Noor Haddad· Dec 12, 2024

    goframe-v2 is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.

  • Ishan Taylor· Dec 8, 2024

    Registry listing for goframe-v2 matched our evaluation — installs cleanly and behaves as described in the markdown.

  • Sakshi Patil· Nov 11, 2024

    Solid pick for teams standardizing on skills: goframe-v2 is focused, and the summary matches what you get after install.

  • Luis Robinson· Nov 7, 2024

    We added goframe-v2 from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.

  • William Martinez· Nov 7, 2024

    Solid pick for teams standardizing on skills: goframe-v2 is focused, and the summary matches what you get after install.

showing 1-10 of 71

1 / 8