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

【Golang】素材设计模式

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

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

// 定义一个通用的业务数据接口
type BusinessData interface {
GetId() int64
GetName() 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, nil
case "project":
// 查询项目数据
var data ProjectData
// ... 查询逻辑
return data, nil
default:
return nil, errors.New("unsupported business type")
}
}

2. 使用泛型(Go 1.18+)

// 定义泛型方法
func GetBusinessData[T SampleData|ProjectData](businessType string, id int64) (T, error) {
var result T
switch 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, nil
case "project":
var data ProjectData
// 查询项目数据逻辑
// ...
return data, nil
default:
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 = data
case "project":
var data ProjectData
// 查询项目数据逻辑
// ...
resp.Data = data
default:
return nil, errors.New("unsupported business type")
}
return resp, nil
}

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

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

// 定义业务审批数据接口
type BusinessApprovalData interface {
GetId() int64
GetBusinessId() int64
GetStatus() 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, nil
case "project":
// 获取项目审批数据
var approvalDataList []ProjectApprovalData
// ... 查询逻辑
return approvalDataList, nil
default:
return nil, errors.New("unsupported business type")
}
}

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

http://www.rkmt.cn/news/11125.html

相关文章:

  • 2025.9.24 闲话:Lucas 定理究极证明
  • 画矩形
  • NOIP 模拟赛八
  • 随便写的
  • Bcliux-docker-nacos2.2.0升级至2.2.3版本
  • 事件和图形界面(暂未完成)
  • Spring连环炮。哈罗面试:Spring Bean生命周期,Spring怎么创建Bean的,BFPP和BPP的x别
  • 软工9.24
  • 无法安装 WebView2! 没有它,此应用就无法运行(解决方式附安装包)
  • 2025CSP-S模拟赛51
  • 2025年9月24日 - 20243867孙堃2405
  • 分库分表后如何高效处理分页
  • 详细介绍:【Selenium】UI自动化测试框架设计:从项目结构到Base-Page层的最佳实践
  • 架构图设计还得是华为 - 智慧园区
  • 解决zsh: corrupt history file /home/sgud4h5gh/.zsh_history的办法
  • 对象初始化器的使用方法
  • 我的学习记录之自我介绍、思维导图和监督措施
  • Nuget安装以及西门子PLC通信
  • 每日反思(2025_09_24)
  • 安装Flask库
  • 日总结 7
  • leetcode(填充每个节点的下一个右侧节点指针 II) - 详解
  • 知识学报:位运算(1)
  • ThinkPHP在启用nginx反向代理后如何获取真实的Ip地址
  • 【macOS】垃圾箱中文档无法清理的“含特殊字符文件名”的技巧
  • Git 工作树 (worktree)、合并 (merge) 流程、拉取请求 (PR) 机制,以及基线分支概念
  • 详细介绍:Cloudflare 推出 GenAI 安全工具,守护企业数据
  • 论小学教师转移矛盾的方法——以“小组连坐制”为例
  • 编译器与链接器--通俗解释
  • idea打开properties文件中文乱码问题