go - impl 函数的参数不足
问题描述
// user.go
package models
type User struct {
Id int `db:"id" json:"id"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
func (User) GetById(c echo.Context, id int) (*User, error) {
db := c.Get("DB").(*sqlx.DB)
user := User{}
err := db.Get(&user, fmt.Sprintf("SELECT id, created_at, updated_at FROM users WHERE id=%d", id))
if err != nil {
fmt.Println(err)
}
return &user, err
}
// main.go
package main
// Success
func fetch_success(c echo.Context) error {
user := models.User{}
user2, err := models.User.GetById(user, c, 5)
}
// Fail: : not enough arguments in call to method expression models.User.GetById
// have (echo.Context, number)
// want (models.User, echo.Context, int)
func fetch_failure(c echo.Context) error {
user, err := models.User.GetById(c, 5)
}
在上面的代码中,GetById 的参数定义是c echo.Context, id int
. 只需要两个参数。但是编译器会提醒我,例如“调用方法表达式 models.User.GetById 的参数不足”
有什么问题?
解决方案
您正在调用方法GetById
,但不在对象上。当 Go 调用一个方法时,它会隐式地将对象作为第一个参数提供。它类似于self
Python 中的传递引用,但在语法上它介于func
关键字和函数名之间。
将其重写为一个函数:
func GetUserById(c echo.Context, id int) (*User, error) {
db := c.Get("DB").(*sqlx.DB)
user := User{}
err := db.Get(&user, fmt.Sprintf("SELECT id, created_at, updated_at FROM users WHERE id=%d", id))
if err != nil {
fmt.Println(err)
}
return &user, err
}
然后打电话
user, err := models.GetUserById(c, 5)
推荐阅读
- python - 列表理解中的 Numpy 数组划分导致大量 RAM 膨胀?
- python-3.x - 嵌套循环不打印正确的行号python
- c# - 在存储库模式中使用左连接和自动映射器
- powershell - ConvertToHTML 转换错误
- mysql - gcloud mysql 5.7是否支持AES-128-CFB8块加密模式?
- azure-data-explorer - Kusto:在固定大小的固定 bin 中汇总具有实数值的不同行
- python - Tensorflow 2.0 模型子类化
- c# - 对空传播感到困惑
- git - 如何管理多 git 仓库 maven 项目?
- javascript - ReactJS 无法编译语法错误 Unexpected token; 常见问题,但我无法解决