【Golang】素材设计模式

news/2025/9/24 20:50:26/文章来源:https://www.cnblogs.com/yfceshi/p/19109964

在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.mzph.cn/news/916227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习问题日记-2

在开发过程中遇到了一个问题,报错描述如下:java: 无法将类 com.chools.demo.entity.Address中的构造器 Address应用到给定类型; 需要: 没有参数 找到: java.lang.String,java.lang.String,java.lang.String …

樟树网站制作wordpress在线音乐

电脑的设备驱动程序:驱动程序一般指的是设备驱动程序(DeviceDriver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,如某设备的驱动程序未能正确安装&a…

封神台复现

EzPyeditor这个界面没啥东西,直接下载源码看一下进去看一下app.py熟悉的界面,又是他 这里先去追踪一下这个函数parse这里这个函数大体上来说是存在一个文件读取的漏洞的 这个漏洞会接受filename这个参数 这里我们就可…

北京商城网站建设费用企业网页如何制作

在window下,我们一般用Source Insight来查看代码而在linux下,使用vim来查看代码,vim是一个简单的文本浏览/编辑器,它可以通过插件的形式,搭建一个完全的类Source Insight环境,通过快捷键的形式,快速查看、定位变量/函数,本文就是基于vim,通过ctags+cscope+taglist+Ner…

网站建设与维护试卷做网站 十万

Mybatis:一对一查询映射处理 前言一、概述二、创建数据模型三、 问题四、解决方案1、方案一:级联方式处理映射关系2、方案二:使用association处理映射关系3、方案三:分步查询 前言 本博主将用CSDN记录软件开发求学之路上亲身所得…

教育网站开发用例图宁波建设网表格

我的方案如下:>单击按钮时,客户端将向服务器端发送请求>一旦服务器端收到请求,它将向远程服务器发送另一个请求以获得结果>一旦响应到来,服务器端应该回应客户端的响应.客户$.post(login_server.php{act:"post",phone:phone,passwords:passwords…

品牌网站建设S苏州未来产品设计

目录 uni-app 项目目录结构 生命周期 路由 路由跳转 页面栈 条件编译 文本渲染 样式渲染 条件渲染 遍历渲染 事件处理 事件修饰符 uni-app 项目目录结构 组件/标签 使用(类似)小程序 语法/结构 使用vue 具体项目目录如下: 生命…

李之一的Java第一作

李之一的Java第一作package com.lixuan.houhou; public class SxisuArray { public static void main(String[] args) { //稀疏数组 :创建一个二维数组11*11 0:没有棋子 1:黑棋 2:白棋 int[][] array1 = new int…

网站在线优化工具珠海百度seo

上期我们讲了面向对象的一些基本信息&#xff0c;这期让我们详细的了解一下 一、面向对象—类 1、PHP类的定义语法&#xff1a; <?php class className {var $var1;var $var2 "constant string";function classfunc ($arg1, $arg2) {[..]}[..] } ?>2、解…

2025.9.24 闲话:Lucas 定理究极证明

小粉兔介绍了一种 Lucas 定理的超级简洁形象的证明,至少是我见过的最简洁的证明。 前置知识:二项式定理。 所用的特殊记号:艾弗森括号、系数提取符 / 系数算子。 Lucas 定理内容: \[\binom{n}{m} \equiv \binom{\l…

打折网站运营思路网站策划的工作要求

变量 变量就像在数学中学习的 x&#xff0c;y 一样&#xff0c;可以直接声明一个变量&#xff0c;并利用这些变量进行基本的运算&#xff0c;声明变量的格式为&#xff1a; 数据类型 变量名称 初始值;&#xff08;其中初始值可以不用在定义变量时设定&#xff09; 是赋值操作…

Are English people good or bad

No one is omniscient and omnipotent to get all of the sample space of the world, so any observation must be incomplete. Singaporeans also speak English. Also judged from young memory, the English can n…

Lampiao靶场渗透wp-脏牛提权

nmap扫描端口 nmap -p- 192.168.111.100 -T4开放三个端口,对80端口进行访问没有什么信息,继续访问1898端口 dirsearch -u http://192.168.111.100:1898/ 直接进行fuzz比较多有用的信息,一个一个分析,由于我们得到了…

画矩形

//题意:根据参数,画出矩形,输入一行, //包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为…

NOIP 模拟赛八

构造场A. \(\oplus\) 有一个很好的性质,操作两次相当于没变。 考虑增量构造。 x y z 变成 x x c 。 x y^z y^z x^y^z y^z x^y^z x x x^y^z \(3\) 次操作做到。 最后会剩下 \(n\) 无法操作,判断此时是否合法,如果否,…

第三篇

今天是9月24日,今天上了离散数学,学了新知识,还学了马克思原理,知识库又丰富了。

基于cloacked-pixel隐写工具爆破项目

cloacked-pixel-break cloacked-pixel-break基于https://github.com/livz/cloacked-pixel 二次开发项目 项目地址 https://github.com/Alexander17-yang/cloacked-pixel-break移除了旧python2的脚本相关限制,使用pyth…

如何做全网影视网站手套外包加工网

Reactor 是一个基于响应式编程的库&#xff0c;主要用于构建异步和事件驱动的应用程序。Reactor 提供了丰富的 API&#xff0c;包括创建、转换、过滤、组合等操作符&#xff0c;用于处理异步数据流。以下是一些 Reactor 的主要 API 示例&#xff1a; pom依赖 <dependencyMan…

随便写的

redis高可用性 一台redis服务器:内存16g,一个进程挂了--------->redis服务挂-------------------->系统不可用 那么就会导致项目不可用 ![shuaikun](C:\Users\86135\Pictures\Camera Roll\蝴蝶刃2.jpg) 避免r…

Bcliux-docker-nacos2.2.0升级至2.2.3版本

Linux 系统版本:Redhat7.9IP:192.158.0.3第一步:备份nacos已有第二步:关停已有nacos[test@01 ~/nacos]$ sudo docker stop 0667969d2570第三步:修改镜像信息sudo docker tag f151dab7a111 nacos_x:2.2.3第四部:复…