我们如何用golang写条件?

时间:2018-07-16 12:35:45

标签: mongodb go

我将查询写在控制器部分,但根据MVC结构,逻辑在模型中,并且控制器部分仅用于发送数据,因此过去我使用的条件如下:-

INSERT into tablename (columnx, columny, etc) VALUES ('valX', 'valY', 'etc')

但是现在上述查询将使用映射更改,并且我正在编写一个函数以将其用于多种用途,以检索数据,例如:-

models.Retrieve(bson.M{"_id": Id, "is_deleted": false})

//fucntion for this query is 
fucn Retrieve(query interface{}){

    // do stuff

}

任何人告诉我,这是正确的方法。如果是,那么告诉我如何?

如果否,请您告诉我这个问题的示例或适合我的问题的答案。

已编辑:-

此功能也可用于通过“代码”表示conditions := make(map[string]interface{}) conditions["operator1"] = "_id" codnitions["value1"] = id conditions["operator2"] = "is_deleted" conditions["value2"] = false func Retrieve(data map[string]interface{}){ //queries here }

查找

它也这样写:-

models.Retrieve(bson.M{"code": Code, "is_deleted": false})

先谢谢您。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您需要一个能够处理不同键值对的函数作为您的查询输入。我在Go中实现了以下步骤:

type UserResolver int

// String satisfies the Stringer interface
func (ur UserResolver) String() string {
    strs := [...]string {
        "ID",
        "Code",
    }
    // return empty string if index out of bounds
    if int(ur) >= len(strs) {
        return ""
    }
    return strs[ur]
}

// Add any required functions to UserResolver that you may require,
// such as schemaKey() that returns the specified schema key value:
// In your example case "_id", "Code", "is_deleted", etc.

const (
    ID UserResolver = iota
    Code
)

func ResolveUser(by UserResolver, value interface{}) (User, error) {
    if by.String() == "" {
        return nil, fmt.Errorf("Unknown UserResolver specified")
    }

    if value == nil {
        return nil, fmt.Errorf("Nil value provided, unable to resolve User")
    }

    // Query details here:
    // It will be specific to your persistence model and remember to follow the
    // best practices for your specific db, such as properly escaping inputs...

    return User, nil
}

此方法通过将UserResolver功能扩展为可以导出或未导出的其他功能(根据您的API设计),为您提供了极大的灵活性。基本上,它使用iota(自动枚举)将各种选项映射到具有const部分中定义的公共索引的切片中。现在,您可以添加使用switch语句执行类型或条件特定工作的函数。

该函数现在可以被其他包调用,如下所示:

u, err := ResolveUser(user.ID, uid)
if err != nil {
    return fmt.Errorf(
        "User not found! Unable to obtain user by %s = %v",
        user.ID,
        uid,
    )
}

条件部分可以类似地实现,然后在查找索引和查找条件之间适当分开。