Недостаточно аргументов для функции 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"
В чем проблема?
1 ответ
Решение
Вы вызываете метод 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)