首页 > 后端开发 > Golang > 正文

如何将映射切片转换为具有不同属性的结构切片

WBOY
发布: 2024-02-08 22:27:29
转载
789 人浏览过

如何将映射切片转换为具有不同属性的结构切片

php小编西瓜为您介绍如何将映射切片转换为具有不同属性的结构切片。在编程中,我们经常会遇到需要将一个映射切片转换为具有不同属性的结构切片的情况。这种转换可以帮助我们更好地组织和管理数据。在本文中,我们将介绍一种简单而有效的方法来实现这一转换,让您的代码更加高效和灵活。让我们一起来看看吧!

问题内容

我正在使用一个 api,我需要向它传递一个结构片段。 我有一片地图,因此我需要将其转换为一片结构。

package main

import "fmt"

func main() {
    a := []map[string]interface{}{}
    b := make(map[string]interface{})
    c := make(map[string]interface{})
    
    b["prop1"] = "foo"
    b["prop2"] = "bar"
    a = append(a, b)

    c["prop3"] = "baz"
    c["prop4"] = "foobar"
    a = append(a, c)

    fmt.println(a)
}
登录后复制
[map[prop1:foo prop2:bar] map[prop3:baz prop4:foobar]]
登录后复制

因此,在这个示例中,我有映射 a 的切片,其中包含 bc ,它们是具有不同键的字符串的映射。

我希望将 a 转换为一个结构体切片,其中第一个元素是一个以 prop1prop2 作为属性的结构体,第二个元素是一个以 prop3prop4 作为属性的结构体。

这可能吗?

我查看了 https://github.com/mitchellh/mapstruct 但我无法让它适用于我的用例。我看过这个答案: https://stackoverflow.com/a/26746461/3390419

解释了如何使用该库:

mapstructure.Decode(myData, &result)
登录后复制

然而,这似乎假设 result 是一个实例的结构是预定义的,而在我的例子中,该结构是动态的。result 是一个实例的结构是预定义的,而在我的例子中,该结构是动态的。

解决方法

您可以做的是首先单独循环每个映射,使用每个映射的键值对构建相应的 reflect.structfield 值切片。准备好这样的切片后,您可以将其传递给 reflect.structof,它将返回一个表示动态结构类型的 reflect.type 值,然后您可以将其传递给 reflect.new 以创建一个 reflect.value

解决方法

您可以做的是首先单独循环每个映射,使用每个映射的键值对构建相应的 reflect.structfield 值切片。准备好这样的切片后,您可以将其传递给 reflect.structof

,它将返回一个表示动态结构类型的 reflect.type 值,然后您可以将其传递给 reflect.new 以创建一个 reflect.value ,它将表示动态结构的实例(实际上是指向该结构的指针)。 例如

var result []any
for _, m := range a {
    fields := make([]reflect.StructField, 0, len(m))

    for k, v := range m {
        f := reflect.StructField{
            Name: k,
            Type: reflect.TypeOf(v), // allow for other types, not just strings
        }
        fields = append(fields, f)
    }

    st := reflect.StructOf(fields) // new struct type
    sv := reflect.New(st)          // new struct value

    for k, v := range m {
        sv.Elem(). // dereference struct pointer
                FieldByName(k).         // get the relevant field
                Set(reflect.ValueOf(v)) // set the value of the field
    }

    result = append(result, sv.Interface())
}
登录后复制
🎜🎜https://www.php.cn/link/3722e31eaa9efae6938cc5c435365dfd🎜🎜

以上是如何将映射切片转换为具有不同属性的结构切片的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板