如何更新任意go结构的所有字符串字段?

2024-05-01

我尝试编写一个函数来更新所有字符串字段随意的结构体,像这样:

type Student struct {
  Name  string
  Age   int
}

func SetStringField(obj interface{}) {
    reflect.ValueOf(obj).Elem().FieldByName("Name").SetString("set name")
}

func main() {
  student := Student{
    "alice",
    12,
  }

  SetStringField(&student)
}

但这个函数只能更新特定字段。我尝试这个:


func SetStringField2(obj interface{}) {
    // Keys := reflect.TypeOf(obj)
    Values := reflect.ValueOf(obj)
    count := reflect.ValueOf(obj).NumField()
    for i := 0; i < count; i++ {
        // fieldKey := Keys.Field(i).Name
        fieldValue := Values.Field(i)
        switch fieldValue.Kind() {
        case reflect.String:
            // fieldValue.CanSet()==false
            fieldValue.SetString("fieldCleanString2 set name")
            // panic: reflect: call of reflect.Value.FieldByName on interface Value
            // reflect.ValueOf(&obj).Elem().FieldByName(fieldKey).SetString("123")
        }
    }
}

func main() {
  student := Student{
    "alice",
    12,
  }
  SetStringField2(student)
}
  1. fieldValue.SetString() 得到“恐慌:反射:reflect.flag.mustBeAssignable 使用不可寻址的值”,因为 fieldValue.CanSet()==false。
  2. Reflect.ValueOf(&obj).Elem().FieldByName(fieldKey).SetString("fieldCleanString2 set name") 也失败,得到“恐慌:反射:在接口 Value 上调用reflect.Value.FieldByName”。

调用 SetStringField2(&student) 得到“恐慌:反射:在 ptr Value 上调用reflect.Value.NumField”

那么,还有其他方法可以完成这项工作吗?


问题是反射值不可设置。要解决此问题,请从指针创建反射值。

// SetStringField2 sets strings fields on the struct pointed to by ps.
func SetStringField2(ps interface{}) {
    v := reflect.ValueOf(ps).Elem() // Elem() dereferences pointer
    for i := 0; i < v.NumField(); i++ {
        fv := v.Field(i)
        switch fv.Kind() {
        case reflect.String:
            fv.SetString("fieldCleanString2 set name")
        }
    }
}

将指向值的指针传递给函数:

student := Student{
    "alice",
    12,
}
SetStringField2(&student)

在操场上跑起来 https://play.golang.org/p/LfWdfJfBxjC.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更新任意go结构的所有字符串字段? 的相关文章

随机推荐

  • 在谷歌应用程序引擎中使用低级 API 进行数据存储?是不是很糟糕?

    关于如何使用数据存储的低级 api 的文档很少 而关于 JPA 和 JDO 以及如何转换为 JPA 和 JDO 的文档却很多 我的问题是 根据 JPA 或 JDO 规范进行编码而不是直接访问数据存储的低级 api 有什么优势吗 乍一看 这似
  • 拒绝访问 .htaccess 中的 .ini 文件是否安全?

    我的 php Web 应用程序中有一个包含敏感信息的 ini 文件 我使用 htaccess 文件拒绝访问它
  • 将 NSTextAttachment 图像置于单行 UILabel 旁边

    我想附加一个NSTextAttachment图像到我的属性字符串并使其垂直居中 我使用以下代码来创建我的字符串 NSMutableAttributedString str NSMutableAttributedString alloc in
  • OAuth:从 Google App Engine 中启动 Google 计算实例

    我有一个 Google App Engine 网络应用程序 它运行着我网站的大部分内容 然而 对于某些功能 我需要一台linux机器 我希望我的 Google App Engine 应用程序能够在某些事件上自动启动 Google 计算实例
  • 如何在android系统状态栏中显示文本

    我正在尝试为 Android Nougat 开发一个应用程序 我想在从 android 服务例程生成的状态栏中显示一些信息 文本 所以我的问题是 我不知道如何在状态栏中显示文本 我添加了一个示例图像来显示我的确切含义 红色圆圈 我知道这是可
  • 路由器基本名称无法匹配 URL,因为它不是以基本名称开头

    升级到 React Router v6 后 我的应用程序停止工作 并且我未能找到在版本 6 中实现相同行为的方法 这是我升级到的版本 react router dom 6 2 1 这是与先前版本一起使用的代码5 2 0
  • JAVA FXCollections LoadException 类不是有效类型

    我正在尝试在此帮助下实现带有一些数据的 TableViewTutorial https docs oracle com javafx 2 fxml get started fxml tutorial intermediate htm CIA
  • 在 github 推送上将静态站点部署到 s3 的最佳策略? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想自动将我们的网站部署到 AWS S3 我已经编写了一个节点脚本来自动构建和上传网站 但我希望每当m
  • 有谁知道这是怎么做到的? SQL注入

    由于许多其他网站已被攻击 我不得不假设它是一个机器人 它注入了一个脚本 昨天 http google stats50 info ur php Today http google stats49 info ur php 它将它注入到多个表中
  • 阈值绝对值

    我有以下功能 char f1 int a unsigned b return abs a lt b 为了执行速度 我想重写如下 char f2 int a unsigned b return unsigned a b lt 2 b redu
  • 如何用C语言查找桌面路径?

    谁能告诉我如何使用 C 语言命令获取桌面路径 环境变量 场景是我想在桌面上保存一个文件 我所能做的就是给出一个固定的桌面路径和一个文件名来保存文件 但是在给出这个固定路径之后 我的代码将变得僵化 并且无法在具有不同桌面路径 环境变量 的任何
  • “ef migrations add”始终在新迁移中重新创建外键

    我安装了 RC1 和 VS 2015 update 1 每当我尝试添加新的迁移时 都会在 Up 方法中重新创建同一组外键 这意味着它们被删除然后直接添加 例如 当我添加迁移而不更改任何模型时 会生成该迁移 当然 Down 方法中也会生成类似
  • 没有确认提示的自定义 URL 方案 (Swift)

    我发现有两个选项可以从 Safari 网页打开我的应用程序 在我的应用程序项目中创建的自定义 URL 方案Info plist或苹果的通用链接 显然 自定义 URL 方案是最容易设置的方案 但我遇到的问题是 Safari 会显示一个确认窗口
  • 客户端使用高端口号

    为什么客户端会结束连接 使用高端口号 临时端口 而应用程序 监听通常较小的端口号 谢谢你的优点 卡蒂克 巴拉古鲁 服务器侦听固定端口号 以便客户端知道连接到哪里 客户端不需要使用固定端口号 因为没有人发起与它们的连接 事实上 如果同一台计算
  • 在 Android 中实现 Signal R

    我尝试过以下方式 import java util concurrent ExecutionException import microsoft aspnet signalr client LogLevel import microsoft
  • JavaScript:无需服务器即可将 HTML 表单和复选框数据保存到 .txt 文件吗?

    我有一个带有文本和复选框输入的 HTML 表单 我想在提交表单时将此表单数据下载到文本文件中 I 找到了从文本框下载数据的解决方案 https stackoverflow com questions 13685263 can i save
  • 在 Postgres 中使用 copy 命令时出错(错误:日期类型的输入语法无效:“”)

    我有一个 CSV 文件 我试图从中使用 PostgresCOPY命令以便从该 CSV 文件填充表 表列之一NEXT VISIT属于日期 data type CSV 文件中本应进入此日期列的某些相应字段具有空值 正在运行的复制命令如下所示 C
  • WebDriver - 元素不可点击 Chrome

    我有以下问题 我在 Firefox 和 Chrome 上运行测试 在 Firefox 上测试运行正确 但在 Chrome SauceLabs 上给出一条消息 unknown error Element is not clickable at
  • “std::size_t”在 C++ 中有意义吗?

    在我继承的一些代码中 我看到频繁使用size t与std命名空间限定符 例如 std size t n sizeof long 当然 它编译并运行得很好 但对我来说这似乎是不好的做法 也许是从 C 继承来的 难道不是吗size t内置于 C
  • 如何更新任意go结构的所有字符串字段?

    我尝试编写一个函数来更新所有字符串字段随意的结构体 像这样 type Student struct Name string Age int func SetStringField obj interface reflect ValueOf