#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)
, первый вариант лучше.