npx skills add https://github.com/cristiano-pacheco/ai-rules --skill go-mapper为 GO 模块化架构生成纯映射器函数。
所有映射器文件都位于 internal/modules/<module>/mapper/ 目录下。
每个领域概念对应一个文件:<name>_mapper.go(例如:user_mapper.go)。
每个映射器函数都遵循 To 前缀约定。它接受一个或多个输入,并返回恰好一个输出,可选择性地返回一个错误。
func ToXxx(input InputType) OutputType
func ToXxx(input InputType) (OutputType, error)
func ToXxx(a TypeA, b TypeB) OutputType
仅返回单个输出。错误是唯一允许的第二个返回值。
Generate pure mapper functions for GO modular architecture.
All mapper files live in internal/modules/<module>/mapper/.
One file per domain concept: <name>_mapper.go (e.g., user_mapper.go).
Every mapper function follows the To prefix convention. It accepts one or more inputs and returns exactly one output, optionally with an error.
func ToXxx(input InputType) OutputType
func ToXxx(input InputType) (OutputType, error)
func ToXxx(a TypeA, b TypeB) OutputType
Single output only. Error is the only allowed second return value.
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
package mapper
import (
"github.com/cristiano-pacheco/pingo/internal/modules/user/dto"
"github.com/cristiano-pacheco/pingo/internal/modules/user/model"
"github.com/cristiano-pacheco/pingo/internal/modules/user/usecase"
)
func ToCreateUserInput(req dto.CreateUserRequest) usecase.CreateUserInput {
return usecase.CreateUserInput{
Name: req.Name,
Email: req.Email,
}
}
func ToUserResponse(u model.UserModel) dto.UserResponse {
return dto.UserResponse{
ID: u.ID,
Name: u.Name,
Email: u.Email,
CreatedAt: u.CreatedAt,
}
}
func ToUserListResponse(models []model.UserModel) []dto.UserResponse {
responses := make([]dto.UserResponse, len(models))
for i, u := range models {
responses[i] = ToUserResponse(u)
}
return responses
}
package mapper
import (
"github.com/cristiano-pacheco/pingo/internal/modules/order/dto"
"github.com/cristiano-pacheco/pingo/internal/modules/order/model"
)
func ToOrderResponse(order model.OrderModel, items []model.OrderItemModel) dto.OrderResponse {
return dto.OrderResponse{
ID: order.ID,
Total: order.Total,
Items: toOrderItemResponses(items),
}
}
func toOrderItemResponses(items []model.OrderItemModel) []dto.OrderItemResponse {
responses := make([]dto.OrderItemResponse, len(items))
for i, item := range items {
responses[i] = dto.OrderItemResponse{
ID: item.ID,
Name: item.ProductName,
Quantity: item.Quantity,
Price: item.Price,
}
}
return responses
}
当转换可能失败时使用(例如,映射过程中的解析、验证)。
package mapper
import (
"github.com/cristiano-pacheco/pingo/internal/modules/product/dto"
"github.com/cristiano-pacheco/pingo/internal/modules/product/errs"
"github.com/cristiano-pacheco/pingo/internal/modules/product/model"
)
func ToProductModel(req dto.CreateProductRequest) (model.ProductModel, error) {
price, err := parsePrice(req.Price)
if err != nil {
return model.ProductModel{}, errs.ErrInvalidPrice
}
return model.ProductModel{
Name: req.Name,
Price: price,
}, nil
}
当映射单个项目时,如果该类型出现在集合中,则添加相应的列表函数。
func ToArticleResponse(a model.ArticleModel) dto.ArticleResponse {
return dto.ArticleResponse{
ID: a.ID,
Title: a.Title,
Author: toAuthorResponse(a),
}
}
func ToArticleListResponse(models []model.ArticleModel) []dto.ArticleResponse {
responses := make([]dto.ArticleResponse, len(models))
for i, a := range models {
responses[i] = ToArticleResponse(a)
}
return responses
}
func toAuthorResponse(a model.ArticleModel) dto.AuthorResponse {
return dto.AuthorResponse{
ID: a.AuthorID,
Name: a.AuthorName,
}
}
<name>_mapper.go,位于 mapper/ 包中ToXxx — 其中 Xxx 是输出类型的名称(例如:ToUserResponse、ToCreateUserInput)toXxx — 小写前缀,用于共享的子映射逻辑ToXxxList 或 ToXxxListResponseTo 前缀 — 每个公共函数都以 To 开头context.Context — 映射器是纯转换,不涉及 I/OTo 约定实现自说明mapper/<name>_mapper.go 中创建映射器文件make lint 以验证代码质量make nilaway 进行静态分析每周安装次数
1
代码仓库
首次出现
今天
安全审计
安装于
zencoder1
amp1
cline1
openclaw1
opencode1
cursor1
package mapper
import (
"github.com/cristiano-pacheco/pingo/internal/modules/user/dto"
"github.com/cristiano-pacheco/pingo/internal/modules/user/model"
"github.com/cristiano-pacheco/pingo/internal/modules/user/usecase"
)
func ToCreateUserInput(req dto.CreateUserRequest) usecase.CreateUserInput {
return usecase.CreateUserInput{
Name: req.Name,
Email: req.Email,
}
}
func ToUserResponse(u model.UserModel) dto.UserResponse {
return dto.UserResponse{
ID: u.ID,
Name: u.Name,
Email: u.Email,
CreatedAt: u.CreatedAt,
}
}
func ToUserListResponse(models []model.UserModel) []dto.UserResponse {
responses := make([]dto.UserResponse, len(models))
for i, u := range models {
responses[i] = ToUserResponse(u)
}
return responses
}
package mapper
import (
"github.com/cristiano-pacheco/pingo/internal/modules/order/dto"
"github.com/cristiano-pacheco/pingo/internal/modules/order/model"
)
func ToOrderResponse(order model.OrderModel, items []model.OrderItemModel) dto.OrderResponse {
return dto.OrderResponse{
ID: order.ID,
Total: order.Total,
Items: toOrderItemResponses(items),
}
}
func toOrderItemResponses(items []model.OrderItemModel) []dto.OrderItemResponse {
responses := make([]dto.OrderItemResponse, len(items))
for i, item := range items {
responses[i] = dto.OrderItemResponse{
ID: item.ID,
Name: item.ProductName,
Quantity: item.Quantity,
Price: item.Price,
}
}
return responses
}
Use when transformation can fail (e.g., parsing, validation during mapping).
package mapper
import (
"github.com/cristiano-pacheco/pingo/internal/modules/product/dto"
"github.com/cristiano-pacheco/pingo/internal/modules/product/errs"
"github.com/cristiano-pacheco/pingo/internal/modules/product/model"
)
func ToProductModel(req dto.CreateProductRequest) (model.ProductModel, error) {
price, err := parsePrice(req.Price)
if err != nil {
return model.ProductModel{}, errs.ErrInvalidPrice
}
return model.ProductModel{
Name: req.Name,
Price: price,
}, nil
}
When mapping a single item, add a corresponding list function if the type appears in collections.
func ToArticleResponse(a model.ArticleModel) dto.ArticleResponse {
return dto.ArticleResponse{
ID: a.ID,
Title: a.Title,
Author: toAuthorResponse(a),
}
}
func ToArticleListResponse(models []model.ArticleModel) []dto.ArticleResponse {
responses := make([]dto.ArticleResponse, len(models))
for i, a := range models {
responses[i] = ToArticleResponse(a)
}
return responses
}
func toAuthorResponse(a model.ArticleModel) dto.AuthorResponse {
return dto.AuthorResponse{
ID: a.AuthorID,
Name: a.AuthorName,
}
}
<name>_mapper.go in mapper/ packageToXxx — where Xxx is the output type name (e.g., ToUserResponse, ToCreateUserInput)toXxx — lowercase prefix for shared sub-mapping logicToXxxList or ToXxxListResponseTo prefix — every public function starts with Tocontext.Context — mappers are pure transformations, no I/OTo conventionmapper/<name>_mapper.gomake lint to verify code qualitymake nilaway for static analysisWeekly Installs
1
Repository
First Seen
Today
Security Audits
Installed on
zencoder1
amp1
cline1
openclaw1
opencode1
cursor1
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
109,600 周安装