Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 域和数据库之间的映射_Go - Fatal编程技术网

Go 域和数据库之间的映射

Go 域和数据库之间的映射,go,Go,我正在创建一个应用程序,它从数据库中获取数据,并将它们作为JSON传递给前端 我认为为从数据库获取的数据和传递给REST服务的数据创建单独的结构是一个好主意。我是对的还是我的错 在这种情况下,我需要将结构从一层映射到另一层。我现在在数据库层执行此操作: func (ds *DataStore) AddUnit(_unit models.Unit) { unit := Unit{} unit.Name = _unit.Name unit.Description = _un

我正在创建一个应用程序,它从数据库中获取数据,并将它们作为JSON传递给前端

我认为为从数据库获取的数据和传递给REST服务的数据创建单独的
结构是一个好主意。我是对的还是我的错

在这种情况下,我需要将结构从一层映射到另一层。我现在在数据库层执行此操作:

func (ds *DataStore) AddUnit(_unit models.Unit) {

    unit := Unit{}
    unit.Name = _unit.Name
    unit.Description = _unit.Description
    db.Create(&unit)
}

func (ds *DataStore) UpdateUnit(id int, _unit models.Unit) models.Unit {

    unit := Unit{}
    db.First(&unit, id)
    unit.Name = _unit.Name
    unit.Description = _unit.Description
    db.Save(&unit)

    return _unit
}

现在,我的代码中每个实体的每个方法中都有这段代码。是否有某种方法或库可以提取此映射功能,并在单独的文件中使用声明方式对其进行描述?

您可以查找并使用库;libs的问题在于,它们试图解决未知问题。图书馆的作者不知道如何使用它。在某些情况下,这会使它们比自己编写代码慢得多,灵活性差得多,而且更复杂

首先,您应该从
数据存储中提取重复逻辑:

// extract the logic of copying across the fields to a function
func setFields(u Unit, unit models.Unit) Unit {
    u.Name = unit.Name
    u.Description = unit.Description
    return u
}

func (ds *DataStore) AddUnit(_unit models.Unit) {
    // trimmed ...
    unit := setFields(Unit{}, _unit)
    // trimmed ...
}

func (ds *DataStore) UpdateUnit(id int, _unit models.Unit) models.Unit {
    unit := Unit{}
    db.First(&unit, id)

    unit = setFields(unit, _unit)

    // trimmed ...
}

您还可以考虑将<代码> SETFiels<代码>的函数调用提取到一个新的接口:

type unitSetter interface {
   setFields(u Unit, unit models.Unit) Unit
}
并将其添加到
数据存储中
,以使代码更具可扩展性、可重用性和可测试性

type DataStore struct {
    // trimmed ...
    units unitSetter
}

func (ds *DataStore) AddUnit(_unit models.Unit) {
    // trimmed ...
    unit := ds.units.setFields(Unit{}, _unit)
    // trimmed ...
}