首頁 > 後端開發 > Golang > 主體

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

WBOY
發布: 2024-02-08 22:27:29
轉載
758 人瀏覽過

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

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
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!