gorm неподдерживаемый пункт назначения, должен быть slice или struct

#go #go-gorm

#Вперед #go-gorm

Вопрос:

Когда я использую этот способ, у него нет ошибки

 var result model.Captcha
fmt.Printf("Type: %T", result)
if err := DB.Model(amp;model.Captcha{}).Where("id = ?", randNum).Find(amp;result).Error; err != nil{
    return nil, err
}
  

Но если я использую следующий способ, возникает ошибка

 var result *model.Captcha
fmt.Printf("Type: %T", result)
if err := DB.Model(amp;model.Captcha{}).Where("id = ?", randNum).Find(result).Error; err != nil{
    return nil, err
}
  

result в первом способе используется тип model.Captcha , затем amp;result в Find (amp;result) используется тип *model.Captcha , во втором способе result используется тип *model.Captcha , но во втором способе есть ошибка?

Кто-нибудь может сказать мне, почему, спасибо!

Ответ №1:

Вы должны определить результат как result := amp;models.Captcha{} , таким образом, вы можете использовать .Find(result) без использования amp; .

пожалуйста, проверьте эту ссылку на go tour для лучшего понимания указателей.

При объявлении var result *models.Captcha компилятор создает нулевой указатель, но с помощью amp; вы можете сгенерировать указатель на базовые модели.Captcha, тогда gorm может использовать этот дескриптор для привязки данных SQL к структуре.

Комментарии:

1. Во-первых, спасибо, что ответили на мой вопрос, но я никогда не видел определения, подобного var result amp;models.Captcha , и, конечно, я попробовал это, но IDE говорит, что это неправильно!

2. извините, проверьте устаревание сообщения, я исправил это. Это должно быть result := amp;models.Captcha{}

3. спасибо, это работает, в прошлый раз я использовал первый способ, и, похоже, он работает нормально, но на этот раз произошла ошибка. Кстати, если местом назначения является slice, как я должен его определить, должно ли это быть var result []model.Captcha , и Find(amp;result) ?

4. да, вы можете использовать var list []models.Captcha и .Find(amp;list) или list := amp;[]models.Captcha{} и .Find(list) , первый вариант лучше.