impl 函数的参数不足
Not enough arguments for impl function
// 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
。只需要两个参数。但是编译器提醒我 "not enough arguments in call to method expression models.User.GetById"
有什么问题?
您正在调用一个方法 GetById
但不是在对象上。当 Go 调用一个方法时,它隐式地将对象作为第一个参数提供。它类似于在 Python 中传递 self
引用,但在语法上它位于 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)
// 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
。只需要两个参数。但是编译器提醒我 "not enough arguments in call to method expression models.User.GetById"
有什么问题?
您正在调用一个方法 GetById
但不是在对象上。当 Go 调用一个方法时,它隐式地将对象作为第一个参数提供。它类似于在 Python 中传递 self
引用,但在语法上它位于 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)