返回顶部
首页 > 资讯 > 精选 >使用其他“部分”结构中的值覆盖结构字段
  • 747
分享到

使用其他“部分”结构中的值覆盖结构字段

2024-02-12 18:02:18 747人浏览 薄情痞子
摘要

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

猜你喜欢
  • 使用其他“部分”结构中的值覆盖结构字段
    php小编西瓜在这里为大家介绍一个有关使用其他“部分”结构中的值覆盖结构字段的方法。在编程中,我们经常需要根据不同的情况来更新结构字段的值。这种情况下,我们可以使用其他结构中的值来覆盖...
    99+
    2024-02-12
  • 覆盖现有的 golang 结构并添加字段
    从现在开始,我们要努力学习啦!今天我给大家带来《覆盖现有的 golang 结构并添加字段》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方...
    99+
    2024-04-04
  • 如何在另一个结构体中使用结构体字段而不将其引用为键
    在PHP的开发中,经常会遇到在一个结构体中使用另一个结构体字段的情况。然而,直接将其引用为键可能会造成代码的混乱和不易维护。那么如何在另一个结构体中使用结构体字段呢?php小编百草为大...
    99+
    2024-02-10
  • 使用反射获取结构体字段的指针值
    珍惜时间,勤奋学习!今天给大家带来《使用反射获取结构体字段的指针值》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望...
    99+
    2024-04-04
  • 使用 Reflect 比较结构体字段
    各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《使用 Reflect 比较结构体字段》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错...
    99+
    2024-04-04
  • 更改函数中的结构字段或返回值
    在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《更改函数中的结构字段或返回值》就很适合你!本篇内容主要包括##content_tit...
    99+
    2024-04-04
  • 如何寻找结构体中未设置值的字段
    今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《如何寻找结构体中未设置值的字段》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看...
    99+
    2024-04-04
  • 如何在 Go 中使用 json.Marshal 外部结构并排除空字段?
    各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《如何在 Go 中使用 json.Marshal 外部结构并排除空字段?》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉...
    99+
    2024-04-04
  • 简化 JSON 响应中的结构字段
    今天编程网给大家带来了《简化 JSON 响应中的结构字段》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支...
    99+
    2024-04-04
  • 如何在 slog 记录器中传递结构并自动使用其字段?
    问题内容 我正在使用 slog 包。我面临的问题是,当我在结构中拥有大部分参数时,我必须向其传递太多参数。 有没有办法修改处理程序以使用这个结构? 就像你可以在 python 中执行的...
    99+
    2024-02-06
  • 结构类型中的条件/可选字段
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《结构类型中的条件/可选字段》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家...
    99+
    2024-04-04
  • 如何使用反射包操作结构中的地图字段?
    珍惜时间,勤奋学习!今天给大家带来《如何使用反射包操作结构中的地图字段?》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的...
    99+
    2024-04-05
  • 计算结构体字段中的切片长度
    php小编鱼仔将为您介绍如何计算结构体字段中的切片长度。在编程中,结构体是一种用于组织相关数据的数据结构。在某些情况下,我们可能需要计算结构体字段中的切片长度,以便在程序中进行相关操作...
    99+
    2024-02-09
  • Python 字典与其他数据结构的比较:优缺点大揭秘
    Python 字典是一种非常强大的数据结构,它允许用户存储键值对,并可以通过键来快速访问值。这使得字典非常适合存储和检索数据,特别是当数据是无序的或者需要快速查找某个特定元素时。 与其他数据结构相比,字典具有以下优点: 快速查找和访问...
    99+
    2024-02-22
    Python 字典 列表 元组 集合
  • 设置用作映射值的不同结构的字段的通用函数
    php小编草莓给大家介绍一款非常实用的通用函数,它能够用于将不同结构的字段设置为映射值。这个函数可以帮助我们在处理数据时更加灵活和方便,不再受限于字段的结构。无论是数组、对象还是其他数...
    99+
    2024-02-10
  • 使用反射递归迭代结构并设置字段
    php小编西瓜在本文中将介绍如何使用反射递归迭代结构并设置字段。反射是PHP中一种强大的特性,它允许我们在运行时获取并操作类、方法、属性等信息。递归迭代结构是一种常用的处理方式,它可以...
    99+
    2024-02-10
  • 使用 Python 将点分隔值转换为 Go 结构
    php小编柚子在本文中将介绍如何使用Python将点分隔值(如"key1.subkey1.subkey2")转换为Go语言中的结构体。这个转换过程对于从配置文件或API响应中提取和处理...
    99+
    2024-02-10
    go语言
  • 将部分数据字节解组到自定义结构中
    问题内容 我有 map[string][]byte 形式的数据,其中 key 是该结构体的 json 字段标记,value 是字节切片。 考虑这个例子: type Tweet stru...
    99+
    2024-02-12
  • C语言简明分析选择结构和循环结构的使用
    目录一、程序中的选择结构(if)二、switch多分支选择语句三、while循环结构四、do...while 与 for五、break和continue一、程序中的选择结构(if) ...
    99+
    2024-04-02
  • 如何在元帅中省略结构的条件字段
    小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《如何在元帅中省略结构的条件字段》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!问题内容...
    99+
    2024-04-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作