Возвращенное утверждение типа интерфейса {} - PullRequest
1 голос
/ 12 апреля 2019

Мне нужна функция, которая делает запрос к базе данных.

Я использую github.com/gocraft/dbr, поэтому я создаю вспомогательную функцию:

//SelectData - selects data from database
func SelectData(table, fields, where string, data interface{}) interface{} {

    var ptr reflect.Value

    ptr = reflect.New(reflect.TypeOf(data)) // create new pointer

    obj := ptr.Interface()

    sess := Session

    query := sess.Select(fields).
        From(table)

    if len(where) > 0 {
        query.Where(where)
    }

    _, err := query.Load(obj)

    if err != nil {
        panic(err)
    }

    return obj

}

, затем я пытаюсь использовать ее:

//CheckUser - checks is user registered in db
func CheckUser(userid string) User {
    var user User
    var i interface{}

    i = db.SelectData("users", "*", "", user)

    fmt.Printf("=%#v \n", i)

    user = i.(User)
    return user
}

Но я получаю ошибку времени выполнения:

interface conversion: interface {} is *models.User, not models.User
D:/Go/src/runtime/panic.go:513 (0x42ccb6)
        gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))
D:/Go/src/runtime/iface.go:248 (0x4091ac)
        panicdottypeE: panic(&TypeAssertionError{iface, have, want, ""})
C:/Users/vasalt/go/src/wcenter/models/model_user.go:29 (0x9dda3a)
        CheckUser: user = i.(User)
C:/Users/vasalt/go/src/wcenter/controllers/ctrl_main.go:59 (0x9e03b6)
        SetPageData: fmt.Printf("=result = %#v\n", models.CheckUser("1234"))

И отладочный вывод:

=&models.User{UID:sql.NullString{String:"1", Valid:true}, UserID:sql.NullString{String:"1234", Valid:true}, UserGroup:sql.NullString{String:"1", Valid:true}}

Таким образом, он успешно извлекает данные из базы данных, но возвращает &models.User не просто models.User, и я не могу понять, как конвертировать interface{} с *models.User в models.User

Ответы [ 2 ]

3 голосов
/ 12 апреля 2019

Я думаю, что это должно работать.Вы можете вписать его в * User и вернуть значение User или * User в зависимости от вашего варианта использования.

user = i.(*User)
return *user
1 голос
/ 12 апреля 2019
 ptr = reflect.New(reflect.TypeOf(data)) // create new pointer

 obj := ptr.Interface()

reflect.New возвращает отражение.значение, представляющее указатель на новый объект типа данных. А ptr.Interface() возвращает действительное значение ptr, тип которого * данные.Поэтому, когда вы вызываете i = db.SelectData("users", "*", "", user), он возвращает * User.You не может использовать утверждение типа i.(User), за исключением i.(*User).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...