为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁星coding 2021-10-11 18:48:48
我读了很多关于 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。
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

或者你可以尝试可变参数解析,比如 Python 如何使用*args


func (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

        }

    }

}


查看完整回答
反对 回复 2021-10-11
  • 2 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信