Недостаточно аргументов для функции impl - PullRequest
0 голосов
/ 27 марта 2020
// 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. Нужно всего два аргумента. Но компилятор предупреждает меня, например: «недостаточно аргументов при вызове моделей выражения метода. User.GetById»

В чем проблема?

1 Ответ

3 голосов
/ 27 марта 2020

Вы вызываете метод 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)
...