尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【Golang】素材设计模式

【Golang】素材设计模式
📅 发布时间:2026/6/18 18:11:21

在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种方式,它们既保持了类型安全,又具有良好的可读性和可维护性。

相关新闻

  • 2025.9.24 闲话:Lucas 定理究极证明
  • 画矩形
  • NOIP 模拟赛八

最新新闻

  • 2026沈阳名表回收行情怎么算?9641笔本地成交数据讲清估价逻辑 - 奢品小当家
  • 2026 年南通角钢批发厂家实地测评,制造业采购干货分享 - LYL仔仔
  • 猫抓浏览器扩展:一键获取网页视频资源的终极指南
  • 强力守护你的Nginx:Gixy配置安全分析器部署指南
  • Laravel Telescope Toolbar 核心功能详解:15 个调试面板完全指南 [特殊字符]
  • Index-1.9B性能评测:19亿参数模型如何超越7B级别竞品

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号