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)