interface在工作中的应用

实现数据库中表的复制

//存放复制表后新id与旧id映射
type CopyIDMap map[string]map[uint32]uint32
//存放传入需要修改的字段与值的映射
type CopyEnvMap map[string]interface{}

//定义接口
type ICopyTable interface {
	TableName() string
	GetCopyQuerySeter(ctx context.Context, copyEnvMap CopyEnvMap,copyIdMap CopyIDMap) ([]ICopyTable, error)
	InsertCopyTable(ctx context.Context, copyEnvMap CopyEnvMap, copyIdMap CopyIDMap) error
	setCopyIDMap(ctx context.Context, copyIdMap CopyIDMap, IDName string, oldId, newId uint32)
}

⚠️注意:map作为参数传入,全局统一,可以获取所有的map值

实现公用函数

不同结构实现某一个接口函数是相同的可以作为一个公共函数
type BaseCopyTable struct {
}

func (b *BaseCopyTable) setCopyIDMap(ctx context.Context, copyIdMap CopyIDMap, IDName string, oldId, newId uint32) {
	if _, ok := copyIdMap[IDName]; !ok {
		copyIdMap[IDName] = make(map[uint32]uint32)
	}
	copyIdMap[IDName][oldId] = uint32(newId)
}

具体的结构体

type App struct {
	BaseCopyTable
	Id             uint32 `orm:"column(id)";pk`
	AppKey         string
	AppSecret      string
	Name           string
	IsDeleted      uint8
	AutoCreateTime time.Time
	AutoUpdateTime time.Time
}

⚠️注:结构体中含有匿名结构体,会把匿名结构体的具体结构包含到结构体中。结构体也会继承匿名结构体的方法。

实现复制的结构体

type BaseCopyApp struct {
	appId      uint32
	appName    string
	copyTables []ICopyTable
	copyEnvMap CopyEnvMap
	CopyIDMap  CopyIDMap
}

//创建对象
func newBaseCopyApp(ctx context.Context, appId uint32, appName string, copyTables []ICopyTable) *BaseCopyApp {
	app := &BaseCopyApp{
		appId:      appId,
		copyTables: copyTables,
		copyEnvMap: CopyEnvMap{
			"app_id":   appId,
			"app_name": appName,
		},
		CopyIDMap: CopyIDMap{},
	}
	return app

}

// 执行复制
func (c *BaseCopyApp) ExecCopy(ctx context.Context) (err error) {
	db := libs.GetMysqlDb("document")

	db.Begin()
	defer func() {
		if err == nil {
			db.Commit()
		} else {
			db.Rollback()
		}
	}()

	// 遍历每张需要复制的表
	for _, copyTable := range c.copyTables {
		// 获取查询结果
		queryResultTables, e := copyTable.GetCopyQuerySeter(ctx, c.copyEnvMap,c.CopyIDMap)
		if e != nil {
			err = e
			return err
		}
		// 执行复制
		for _, queryResultTable := range queryResultTables {
			e := queryResultTable.InsertCopyTable(ctx, c.copyEnvMap, c.CopyIDMap)
			if e != nil {
				err = e
				return err
			}
		}
	}
	return
}

不同复制表,获取不同的对象

func NewCopyOcrTemplate(ctx context.Context, appId uint32, appName string) *BaseCopyApp {
	copyTables := []ICopyTable{
		&App{},
	}
	return newBaseCopyApp(ctx, appId, appName, copyTables)
}

⚠️注:interface{}可以接收各种类型,接收的都是interface类型

var  test []interface{}
test = append(test,10)

如果interface是一个接口,所有实现interface的结构体也都是interface类型

var test interface{
	TableName() string
}
type kk struct{
	a  int
}
func(k *kk)TableName() string{
	return "kk"
}

testList := []test{
	&kk{},
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值