我读了很多关于 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
}
}
}
- 2 回答
- 0 关注
- 154 浏览
添加回答
举报
0/150
提交
取消