Go &引用;反映:字段索引超出范围“;更新时出现恐慌

Go &引用;反映:字段索引超出范围“;更新时出现恐慌,go,go-gorm,Go,Go Gorm,我在用Gorm实现一个基本更新时感到恐慌,我找不到任何关于它的信息。按照Gorm的文档,我看起来并没有做错什么 module achiever go 1.15 require ( gorm.io/driver/postgres v1.0.5 gorm.io/gorm v1.20.7 ) 类型任务结构{ ID uint`json:“ID”gorm:“主键”` 标题字符串`json:“标题”` } 类型UpdateTaskInput结构{ 标题字符串`json:“标题”` }

我在用Gorm实现一个基本更新时感到恐慌,我找不到任何关于它的信息。按照Gorm的文档,我看起来并没有做错什么

module achiever

go 1.15

require (
    gorm.io/driver/postgres v1.0.5
    gorm.io/gorm v1.20.7
)
类型任务结构{
ID uint`json:“ID”gorm:“主键”`
标题字符串`json:“标题”`
}
类型UpdateTaskInput结构{
标题字符串`json:“标题”`
}
func UpdateTask(id uint,输入UpdateTaskInput)布尔{
var任务
if err:=models.DB.Where(“id=?”,id).First(&task).Error;err!=nil{
返回错误
}
models.DB.Model(&task).更新(输入)
返回真值
}

我无法找出错误的来源。

据我所知,更新不支持“智能选择字段”,因此您需要先构造原始结构

models.DB.Model(&task).更新(&task{Title:input.Title})

我遇到了同样的问题,正如jugendhacker所说:您需要在更新函数中构造模型的结构:

models.DB.Model(&task).Updates(&Task{Title: input.Title})

这在中有说明,如果您正在构建一个API,那么将其作为一个PUT方法来实现就更合适了,因为您正在传递一个新对象,而不是修补一个现有对象。

ID
字段添加到
updateaskinput
结构可以解决此问题

type UpdateTaskInput struct {
    ID uint `json:"-"`
    Title string `json:"title"`
}
type UpdateTaskInput struct {
    ID uint `json:"-"`
    Title string `json:"title"`
}