如何解决使用反射的接口通过指针接收器更新函数中的结构体字段
我有多个结构来描述来自不同表的一些数据库条目。它们都实现了 Model 接口。所有结构都有一个ID,但是ID的名称不同:例如,“ Location”结构具有“ LocationID”,Note结构具有“ NoteID”。。我想编写一个能够更新所有结构的函数。实现 Model 接口的结构的ID:
location := Location{LocationID: 1,...}
UpdateModelID(&location,2)
note := Note{NoteID: 5,...}
UpdateModelID(¬e,10)
我已经尝试过使用反射,但是我还没有真正可以设置一个字段的值。
这是到目前为止的功能代码:
func UpdateModelID(mdl *Model,id int) {
switch reflect.TypeOf(*mdl).Kind() {
case reflect.TypeOf(Location{}).Kind():
reflect.ValueOf(mdl).Elem().Elem().FieldByName("LocationID").SetInt(int64(id))
default:
log.Panicf("Type %T is not supported",mdl)
}
}
在运行时,它会显示以下消息:
reflect:使用不可寻址的值reflect.flag.mustBeAssignable
现在我的问题是,如果该函数仅允许接收指向接口的指针,则是否可以实际设置结构的字段。如果我不使用指针接收器,可能会更容易,但是由于我需要更新很多条目,因此一堆又四分之一地复制结构会损害性能。在这里我已经阅读了很多关于stackoverflow的类似问题,但是不幸的是我还没有真正找到答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。