为什么控制器中的 Revel 可选 func 参数不起作用?CRUD 代码冗余

我读了很多关于 Go 的书,发现方法或函数中不能有可选参数(某些参数也不能有默认值)。让我们以简单的CRUD为例。


我想使用相同的控制器操作来创建和更新,只是为了简单:


func (c Account) User(user models.User, verifyPassword string, id ...int64) {


    /*

    validate user etc

   */

    if len(id) > 0 {

        c.Txn.Update(&model)

    } else{

        c.Txn.Insert(&model)

    }

}

当我尝试{{ url "Account.User" }}在模板中执行时,我收到一条错误消息,指出我缺少参数。一旦我对路由值进行了硬编码,我就会在代码的未知部分有一些无效的内存地址或 nil 指针取消引用。


如果没有可选/默认参数,我将拥有我不想要的 CRUD 代码冗余!


因此,我将不得不为同一件事使用两个函数,而不是一个函数,这些函数仅在一行代码中有所不同。


自从我 7 天前开始学习 Go 和 Revel 以来,也许我错过了一些东西。我使用 Go 和 Revel 的唯一原因是为了速度。我将它用于一些有大量请求(每天数百万)的项目。


有没有办法解决这个问题?


更新

第一个问题是视图: {{ url "Account.User" }}


当我这样使用它时,它说:


missing parameter id for route Account.User in func (c Account) User(user models.User, verifyPassword string, id ...int64)

所以这更像是一个 Revel 问题,而不是 Go。


繁星coding
浏览 156回答 2
2回答

暮色呼如

或者你可以尝试可变参数解析,比如 Python 如何使用*argsfunc (c Account) User(args ...interface{}) {    for _, arg := range args {        switch v := arg.(type) {        case models.User:            // validate user        case string:            // verify password        case []int64:            if len(v) > 0 {                c.Txn.Update(&model)            } else {                c.Txn.Insert(&model)            }        default:            // some default stuff        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go