-1
// 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 的参数不足”

有什么问题?

4

1 回答 1

3

您正在调用方法GetById,但不在对象上。当 Go 调用一个方法时,它会隐式地将对象作为第一个参数提供。它类似于selfPython 中的传递引用,但在语法上它介于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)
于 2020-03-27T12:13:33.563 回答