PHP小编西瓜在这里为大家介绍一个有关使用其他“部分”结构中的值覆盖结构字段的方法。在编程中,我们经常需要根据不同的情况来更新结构字段的值。这种情况下,我们可以使用其他结构中的值来覆盖
PHP小编西瓜在这里为大家介绍一个有关使用其他“部分”结构中的值覆盖结构字段的方法。在编程中,我们经常需要根据不同的情况来更新结构字段的值。这种情况下,我们可以使用其他结构中的值来覆盖目标结构中的字段。这种方法非常实用,可以提高代码的可读性和灵活性。接下来,我将详细介绍如何使用这种技巧来简化代码并提高效率。
我是 Go 新手,正在尝试创建 CRUD api。请原谅 Go 中的 OOP 方法可能不聪明。我有一个结构,我想通过 PATCH 端点进行部分更新。
type Book struct {
Id uuid.UUID `JSON:"id"`
Author uuid.UUID `json:"author"`
Title string `json:"title"`
IsPublic bool `json:"isPublic"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt *time.Time `json:"updatedAt"`
DeletedAt *time.Time `json:"deletedAt"`
}
我已经定义了第二个结构体,其中包含一本书的可更新属性。
type PatchBookDto struct {
Author *uuid.UUID
Title *string
IsPublic *bool
}
在这两个结构中,我都使用(可能滥用?)指针属性来模拟可选参数。我想要实现的是用 PatchBookDto 中的任何给定属性覆盖一本书。这是我迄今为止的尝试:
var book models.Book // Is taken from an array of books
var dto dtos.PatchBookDto
if err := c.BindJSON(&dto); err != nil {
// Abort
}
dtoTypeInfo := reflect.TypeOf(&dto).Elem()
for i := 0; i < dtoTypeInfo.NumField(); i++ {
dtoField := dtoTypeInfo.Field(i)
bookField := reflect.ValueOf(&book).Elem().FieldByName(dtoField.Name)
if bookField.IsValid() && bookField.CanSet() {
dtoValue := reflect.ValueOf(dto).Field(i)
if dtoValue.Interface() == reflect.Zero(dtoValue.Type()).Interface() {
continue
}
if dtoField.Type.Kind() == reflect.Ptr {
if dtoValue.Elem().Type().AssignableTo(bookField.Type()) {
bookField.Set(dtoValue.Elem())
} else {
// Abort
}
}
convertedValue := dtoValue.Convert(bookField.Type())
bookField.Set(convertedValue)
}
}
当我测试这个时,我收到 reflect.Value.Convert: value of type *string Cannot be conversion to type string
错误。
有人知道我可以在这里改进什么以获得我需要的东西吗?
看起来您打算将恐慌行放在 if dtoField.Type.Kind() ==reflect.Ptr
的 else 块中。
另一种方法是使用间接指针,然后设置值。
for i := 0; i < dtoTypeInfo.NumField(); i++ {
dtoField := dtoTypeInfo.Field(i)
bookField := reflect.ValueOf(&book).Elem().FieldByName(dtoField.Name)
if bookField.IsValid() && bookField.CanSet() {
dtoValue := reflect.ValueOf(dto).Field(i)
if dtoValue.Interface() == reflect.Zero(dtoValue.Type()).Interface() {
continue
}
dtoValue = reflect.Indirect(dtoValue)
convertedValue := dtoValue.Convert(bookField.Type())
bookField.Set(convertedValue)
}
}
以上就是使用其他“部分”结构中的值覆盖结构字段的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 使用其他“部分”结构中的值覆盖结构字段
本文链接: https://lsjlt.com/news/563878.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0