iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > GO >如何给reflect Field()赋值?
  • 680
分享到

如何给reflect Field()赋值?

2024-04-04 23:04:05 680人浏览 泡泡鱼
摘要

来到编程网的大家,相信都是编程学习爱好者,希望在这里学习golang相关编程知识。下面本篇文章就来带大家聊聊《如何给reflect Field()赋值?》,介绍一下,希望对大家的知识积累有所帮助,助

来到编程网的大家,相信都是编程学习爱好者,希望在这里学习golang相关编程知识。下面本篇文章就来带大家聊聊《如何给reflect Field()赋值?》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发

问题内容

我就遇到过这样的问题。 我需要比较两个结构,如果它们的类型和字段名称相同。 将值从 sour 分配给 dist。我编写了一些代码,但在这里我可以分配 reflect.field() 值。你可以帮帮我吗?我在下面创建测试

import (
    "reflect"
    "testing"
)

func Assign(sour interface{}, dist interface{}) uint {
    counter := 0
    source  := reflect.ValueOf(sour)

    target  := reflect.ValueOf(dist)

    typeSource := reflect.TypeOf(sour)


    typeTarget := reflect.TypeOf(dist)
    for i:=0; i<source.NumField(); i++{
        for j:=0; j<target.NumField();j++{
            if (typeSource.Field(i).Type==typeTarget.Field(j).Type && typeSource.Field(i).Name==typeTarget.Field(j).Name){
                counter = counter + 1
                target.FieldByName(typeSource.Field(i).Name).Set(source.Field(i))


            }
        }
    }

    return uint(counter)
}

func TestAssign(t *testing.T) {
    type A struct {
        A string
        B uint
        C string
    }
    type B struct {
        AA string
        B  int
        C  string
    }
    var (
        a = A{
            A: "Тест A",
            B: 55,
            C: "Test C",
        }
        b = B{
            AA: "OKOK",
            B:  10,
            C:  "FAFA",
        }
    )
    result := Assign(a, b)
    switch true {
    case b.B != 10:
        t.Errorf("b.B = %d; need to be 10", b.B)
    case b.C != "Test C":
        t.Errorf("b.C = %v; need to be  'Test C'", b.C)
    case result != 1:
        t.Errorf("Assign(a,b) = %d; need to be 1", result)
    }
}


解决方案


要使 assign 工作,第二个参数必须可寻址,即您需要传递指向结构值的指针。

// the second argument must be a pointer to the struct
assing(source, &target)

然后您需要稍微修改 assign 的实现,因为指针没有字段。您可以使用Elem()方法来获取指针指向的结构体值。

func Assign(sour interface{}, dist interface{}) uint {
    counter := 0
    source := reflect.ValueOf(sour)

    // dist is expected to be a pointer, so use Elem() to
    // get the type of the value to which the pointer points
    target := reflect.ValueOf(dist).Elem()

    typeSource := reflect.TypeOf(sour)

    typeTarget := target.Type()
    for i := 0; i < source.NumField(); i++ {
        for j := 0; j < target.NumField(); j++ {
            if typeSource.Field(i).Type == typeTarget.Field(j).Type && typeSource.Field(i).Name == typeTarget.Field(j).Name {
                counter = counter + 1
                target.FieldByName(typeSource.Field(i).Name).Set(source.Field(i))

            }
        }
    }

    return uint(counter)
}

本篇关于《如何给reflect Field()赋值?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注编程网公众号!

您可能感兴趣的文档:

--结束END--

本文标题: 如何给reflect Field()赋值?

本文链接: https://www.lsjlt.com/news/596142.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何给reflect Field()赋值?
    来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《如何给reflect Field()赋值?》,介绍一下,希望对大家的知识积累有所帮助,助...
    99+
    2024-04-04
  • jquery如何给li赋值
    使用jquery给li标签赋值的方法:1.新建html项目,引入jquery;2.创建li标签列表;3.添加button按钮,绑定onclick点击事件;4.在点击事件中创建数组;5.通过each()方法遍历标签,使用text()方法赋值;...
    99+
    2024-04-02
  • jquery如何给div赋值
    使用jquery给div赋值的方法:1.新建html项目,引入jquery;2.创建div标签,设置id属性;3.添加button按钮,绑定onclick点击事件;4.通过id属性获取对象,使用text()方法赋值;具体步骤如下:首先,新建...
    99+
    2024-04-02
  • jquery如何给值赋空
    使用jquery给值赋空的方法:1.新建html项目,引入jquery;2.创建input输入框,设置id属性;3.添加button按钮,绑定onclick点击事件;4.通过id获取input对象,使用prop()方法给值赋空;具体步骤如下...
    99+
    2024-04-02
  • vue如何给input赋值
    在vue中给input赋值的方法:1.新建vue.js项目;2.添加input输入框;3.为input添加@input="changeVersion"样式属性;4.执行代码为input赋值;具体步骤如下:首先,在vue-...
    99+
    2024-04-02
  • jquery如何给src赋值
    使用jquery给src属性赋值的方法:1.新建html项目,引入jquery;2.创建img标签,设置id属性;3.添加button按钮,绑定onclick点击事件;4.通过id属性获取标签对象,使用attr()方法赋值;具体步骤如下:首...
    99+
    2024-04-02
  • jquery如何给textarea赋值
    使用jquery给textarea赋值的方法:1.新建html项目,引入jquery;2.创建textarea文本域,设置id属性;3.添加button按钮,绑定onclick点击事件;4.通过id获取textarea对象,使用html()...
    99+
    2024-04-02
  • jquery如何给label赋值
    使用jquery给label赋值的方法:1.新建html项目,引入jquery;2.创建label标签,设置id属性;3.添加button按钮,绑定onclick点击事件;4.通过id获取label对象,使用text()方法赋值;具体步骤如...
    99+
    2024-04-02
  • jquery如何给span赋值
    使用jquery给span赋值的方法:1.新建html项目,引入jquery;2.创建span标签,设置id属性;3.添加button按钮,绑定onclick点击事件;4.通过id属性获取对象,使用html()方法赋值;具体步骤如下:首先,...
    99+
    2024-04-02
  • jquery如何给某列赋值
    使用jquery给某列赋值的方法:1.新建html项目,引入jquery;2.创建table表格;3.添加button按钮,绑定onclick点击事件;4.通过标签名获取表格对象,使用find()方法获取指定列;5.使用html()方法赋值...
    99+
    2024-04-02
  • jquery如何给数组赋值
    使用jquery给数组赋值的方法:1.新建html项目,引入jquery;2.使用var关键字定义空数组;3.使用push()方法对数组赋值;具体步骤如下:首先,新建一个html项目,并在项目中引入jquery;<script typ...
    99+
    2024-04-02
  • vue如何给标签赋值
    在vue中给标签赋值的方法:1.新建vue.js项目;2.在项目中添加div标签,并设置labelId属性;3.使用v-bind指令绑定标签属性;4.通过例化vue对象给标签赋值;具体步骤如下:首先,在vue-cli中创建一个vue.js项...
    99+
    2024-04-02
  • JAVA如何给变量赋值
    在Java中,可以使用赋值运算符(=)将一个值赋给变量。例如: int x; // 声明一个整数变量x x = 10; // 给x赋...
    99+
    2023-10-25
    JAVA
  • jquery如何给select框赋值
    使用jquery给select下拉框赋值的方法:1.新建html项目,引入jquery;2.创建select下拉框,设置id属性;3.添加button按钮,绑定onclick点击事件;4.通过id获取下拉框对象,使用each()方法遍历下拉...
    99+
    2024-04-02
  • jquery如何给input框赋值
    使用jquery给input框赋值的方法:1.新建html项目,引入jquery;2.创建input输入框,设置id属性;3.添加button按钮,绑定onclick点击事件;4.通过id属性获取input对象,使用val()方法赋值;具体...
    99+
    2024-04-02
  • 如何将javascript值赋给PHP
    本篇内容介绍了“如何将javascript值赋给PHP”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、使用表单提交最常见的将JavaScr...
    99+
    2023-07-06
  • python如何给数组赋值
    在Python中,可以使用以下方法给数组赋值:1. 使用索引赋值:可以通过索引来访问数组的特定元素,并将其赋值给一个新的值。例如:`...
    99+
    2023-08-19
    python
  • vb如何给数组赋值
    在VB中,可以使用循环结构或直接赋值的方式给数组赋值。 方法一:使用循环结构赋值 Dim arr(5) As Integer For...
    99+
    2024-02-29
    vb
  • python如何给变量赋值
    python可以通过基本的变量赋值、多重赋值、增量赋值、复合赋值运算符和全局变量和局部变量赋值。详细介绍:1、基本的变量赋值步骤是将数字赋给变量,将字符串赋给变量,将布尔值赋给变量,将列表赋给变量;2、多重赋值步骤是交换变量值,从函数返回多...
    99+
    2023-12-13
    python
  • java中如何给变量赋值
    在Java中给变量赋值有两种方式:1. 直接赋值:通过使用等号(=)将一个值赋给变量。例如:`int num = 10;` (将10...
    99+
    2023-08-17
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作