首頁 > 後端開發 > Golang > 如何解組具有不同資料類型的 Go 數組?

如何解組具有不同資料類型的 Go 數組?

Patricia Arquette
發布: 2024-12-14 02:28:09
原創
634 人瀏覽過

How to Unmarshal a Go Array with Disparate Data Types?

在 Go 中解組不同類型的陣列

處理鍵值對時,解組很簡單。然而,以不同的順序對一組混合類型進行編組是一個挑戰。解決這個問題需要一個能夠靈活地適應不同資料類型的解決方案。

Go 程式語言為處理這種情況提供了一個優雅的選項。透過利用介面{}類型與類型斷言相結合,我們可以動態分析每個陣列元素的底層類型並相應地進行解組。

讓我們重新審視有問題的程式碼並修改它以利用此技術:

package main

import (
    "encoding/json"
    "fmt"
)

func decodeJSON(f interface{}) {
    switch vf := f.(type) {
    case map[string]interface{}:
        fmt.Println("is a map:")
        for k, v := range vf {
            checkTypeAndDecode(k, v)
        }
    case []interface{}:
        fmt.Println("is an array:")
        for k, v := range vf {
            checkTypeAndDecode(k, v)
        }
    }
}

func checkTypeAndDecode(k string, v interface{}) {
    switch vv := v.(type) {
    case string:
        fmt.Printf("%v: is string - %q\n", k, vv)
    case int:
        fmt.Printf("%v: is int - %q\n", k, vv)
    default:
        fmt.Printf("%v: ", k)
        decodeJSON(v)
    }
}

func main() {
    my_json := `{
    "an_array":[
    "with_a string",
    {
        "and":"some_more",
        "different":["nested", "types"]
    }
    ]
}`

    var f interface{}
    err := json.Unmarshal([]byte(my_json), &f)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("JSON:")
        decodeJSON(f)
    }
}
登入後複製

此修改後的程式碼使用decodeJSON函數遞歸地分析JSON結構,識別每個元素的資料類型並列印適當的表示。對於複雜的巢狀結構,執行對decodeJSON的巢狀呼叫。

此修訂後的程式碼產生的輸出說明瞭如何根據其資料類型正確識別和列印每個元素:

JSON:
is a map:
an_array: is an array:
0: is string - "with_a string"
1: is a map:
and: is string - "some_more"
different: is an array:
0: is string - "nested"
1: is string - "types"
登入後複製

與透過增強對Go 中類型處理的理解,您可以自信地解組包含異質資料類型組合的數組,確保應用程式中準確且一致的資料表示。

以上是如何解組具有不同資料類型的 Go 數組?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板