当前位置: 首页 > news >正文

【Golang】数据设计模式

在Go语言中,根据不同业务类型返回不同表数据,可以使用以下几种方式来设计方法的出参:

1. 使用接口(interface)作为返回类型

// 定义一个通用的业务数据接口
type BusinessData interface {GetId() int64GetName() string
}// 不同业务类型实现该接口
type SampleData struct {Id   int64  `json:"id"`Name string `json:"name"`// 其他样本特有字段
}func (s SampleData) GetId() int64 { return s.Id }
func (s SampleData) GetName() string { return s.Name }type ProjectData struct {Id   int64  `json:"id"`Name string `json:"name"`// 其他项目特有字段
}func (p ProjectData) GetId() int64 { return p.Id }
func (p ProjectData) GetName() string { return p.Name }// 业务处理方法
func GetBusinessData(businessType string, id int64) (BusinessData, error) {switch businessType {case "sample":// 查询样本数据var data SampleData// ... 查询逻辑return data, nilcase "project":// 查询项目数据var data ProjectData// ... 查询逻辑return data, nildefault:return nil, errors.New("unsupported business type")}
}

2. 使用泛型(Go 1.18+)

// 定义泛型方法
func GetBusinessData[T SampleData|ProjectData](businessType string, id int64) (T, error) {var result Tswitch businessType {case "sample":if t, ok := any(result).(SampleData); ok {// 查询样本数据逻辑// ...result = any(t).(T)}case "project":if t, ok := any(result).(ProjectData); ok {// 查询项目数据逻辑// ...result = any(t).(T)}}return result, nil
}

3. 使用any/interface{} + 类型断言

func GetBusinessData(businessType string, id int64) (interface{}, error) {switch businessType {case "sample":var data SampleData// 查询样本数据逻辑// ...return data, nilcase "project":var data ProjectData// 查询项目数据逻辑// ...return data, nildefault:return nil, errors.New("unsupported business type")}
}// 使用时进行类型断言
func Usage() {data, err := GetBusinessData("sample", 1)if err != nil {// 处理错误return}switch v := data.(type) {case SampleData:// 处理样本数据fmt.Println("Sample:", v.Name)case ProjectData:// 处理项目数据fmt.Println("Project:", v.Name)}
}

4. 使用统一的响应结构体

type BusinessResponse struct {BusinessType string      `json:"businessType"`Data         interface{} `json:"data"`
}func GetBusinessData(businessType string, id int64) (*BusinessResponse, error) {resp := &BusinessResponse{BusinessType: businessType,}switch businessType {case "sample":var data SampleData// 查询样本数据逻辑// ...resp.Data = datacase "project":var data ProjectData// 查询项目数据逻辑// ...resp.Data = datadefault:return nil, errors.New("unsupported business type")}return resp, nil
}

5. 在你的具体场景中应用

根据你提供的代码,可以这样设计:

// 定义业务审批数据接口
type BusinessApprovalData interface {GetId() int64GetBusinessId() int64GetStatus() int
}// 样本审批数据
type SampleApprovalData struct {Id         int64  `json:"id"`BusinessId int64  `json:"businessId"`SampleName string `json:"sampleName"`Status     int    `json:"status"`
}func (s SampleApprovalData) GetId() int64 { return s.Id }
func (s SampleApprovalData) GetBusinessId() int64 { return s.BusinessId }
func (s SampleApprovalData) GetStatus() int { return s.Status }// 项目审批数据
type ProjectApprovalData struct {Id         int64  `json:"id"`BusinessId int64  `json:"businessId"`ProjectName string `json:"projectName"`Status     int    `json:"status"`
}func (p ProjectApprovalData) GetId() int64 { return p.Id }
func (p ProjectApprovalData) GetBusinessId() int64 { return p.BusinessId }
func (p ProjectApprovalData) GetStatus() int { return p.Status }// 修改你的方法
func (c *cUserTask) ToDoTaskList(ctx context.Context, req *usertask.UserTaskListInp) (interface{}, error) {instanceIdList, err := c.ToDoTaskInstanceIdList(ctx)if err != nil {return nil, err}if req.BusinessType == "" {return nil, nil}inp := bizin.WorkflowModelInstanceByConditionInp{FlwInstantIdList: instanceIdList, BusinessType: req.BusinessType,}instanceList, err := service.BizWorkflowModelInstance().ListByCondition(ctx, &inp)if err != nil {return nil, err}businessIdList := make([]int64, 0, len(instanceList))for _, each := range instanceList {businessIdList = append(businessIdList, each.BusinessId)}// 根据业务类型返回不同数据switch req.BusinessType {case "sample":// 获取样本审批数据var approvalDataList []SampleApprovalData// ... 查询逻辑return approvalDataList, nilcase "project":// 获取项目审批数据var approvalDataList []ProjectApprovalData// ... 查询逻辑return approvalDataList, nildefault:return nil, errors.New("unsupported business type")}
}

推荐使用第1种或第4种方式,它们既保持了类型安全,又具有良好的可读性和可维护性。

http://www.dtcms.com/a/398392.html

相关文章:

  • 新建免费网站软件关键词排名
  • 小迪安全v2023学习笔记(八十六讲)—— FridaHOOK证书提取SSL双向校验绕过
  • 律师事务所网站方案网站 建设 初期规划
  • 舒适化诊疗的关键支持:伟荣局部麻醉器械使用体验
  • Kanass入门到实战(1) - 安装教程
  • 【Linux系统】深入理解线程同步,实现生产消费模型
  • 【2025-系统规划与管理师】第六章:云资源规划
  • JDK17 新特性梳理
  • ZooKeeper源码分析与实战-模块一:基础篇
  • 网站建设 优势网站开发需求报告
  • jikuaiarc项目构建,参考arc,把arc一直到antlr4,生成g4文件
  • 白话讲讲GenAI、LLM、Agent、RAG、LangChain
  • (25.09)使用Livox-mid-360录制数据并运行Fast-lio2命令
  • 【图文】Codex接入Kimi K2/GLM-4.5 环境配置指南 (Windows/macOS/Ubuntu)
  • 异步 vs 同步:JavaScript中的速度与激情
  • Django模型与数据表的映射方式详解:不止Code First与Database First
  • LangChain4J-(7)-Function Calling
  • C程序设计-01程序设计和C语言
  • 为何上不了建设银行网站网络营销工程师前景
  • 设计模式的几个准则
  • python+nodejs+springboot在线车辆租赁信息管理信息可视化系统
  • 计算机毕业设计 基于Python的音乐推荐系统 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 《人机分工重塑开发:遗留系统重构的AI实践指南》
  • 从0死磕全栈第十天:nest.js集成prisma完成CRUD
  • 网站开发做什么科目网页设计与网站建设连接数据库
  • 如何看网站是html几代做的加拿大pc网站搭建
  • C#的MVVM架构中的几种数据绑定方式
  • Jmeter接口测试:jmeter组件元件介绍,利用取样器中http发送请求
  • Apache Tomcat 部署与配置
  • 网站建设详细合同范本西部数码网站管理助手破解版