首頁  >  文章  >  後端開發  >  如何將映射切片轉換為具有不同屬性的結構切片

如何將映射切片轉換為具有不同屬性的結構切片

WBOY
WBOY轉載
2024-02-08 22:27:29758瀏覽

如何將映射切片轉換為具有不同屬性的結構切片

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 是一個實例的結構是預先定義的,而在我的例子中,該結構是動態的。

解決方法

您可以做的是首先單獨循環每個映射,使用每個映射的鍵值對建立相應的 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刪除