亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 映射結構映射

Golang 映射結構映射

Go
明月笑刀無情 2023-03-21 14:54:21
這是我的數據結構,并試圖為此數據創建一個結構,但因錯誤而失敗。{                "data": {                  "image": {                    "url": "tests.jpg"                  }                }              }錯誤:-prog.go:16:20: invalid field name "Data" in struct initializerprog.go:16:22: missing type in composite literal代碼:-package mainimport (    "fmt")type Images struct {    Data struct {        Image struct {            url string        }    }}func main() {    i := Images{"Data": {"Image": {"url": "test.jpg"}}}    fmt.Println(i)}閱讀以下答案后,我嘗試了這個 -package mainimport (    "fmt")//{ "data": {//                  "image": {//                    "url": "tests.jpg"//                  }//                }//              }type Images struct {    Data Data}type Data struct {    Image Image}type Image struct {    url string}func main() {    i := Images{        Data: Data{            Image: Image{url: "test.jpg"}}}    fmt.Println(i)}最終輸出:-{{{test.jpg}}}
查看完整描述

1 回答

?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

這里有許多容易混淆的問題。


輸出:

首先也是最重要的是您沒有指定任何特定的輸出格式。使用 fmt.Println 輸出數據結構實際上只是為了方便調試,格式非常隨意,如果使用fmt.Printf("%#v\n", i). 默認的 Println 輸出 Printf 的“%v”的等價物。


要獲得特定格式的輸出(Go 本身除外),您需要導入一個可以生成該格式的包。幸運的是,標準庫中包含了一些流行的格式。但在我們開始之前,還有一些其他的事情需要解決/理解。


出口:

結構的大寫成員是導出的小寫成員不是。這意味著圖像結構中的“url”必須大寫,否則諸如此類的包encoding/json將無法訪問該成員以將其導出。


匿名類型:

其他人強調為整體結構中的每個結構化數據類型創建顯式定義,我認為這通常是個好建議。然而,有那么多一次性的類型定義四處飄蕩也常常是愚蠢的,所以在語言中使用內聯匿名結構定義是完全可以接受的。另外一個很好的接觸是結構相同的匿名類型被接受為與定義類型不同的相同類型。


這是一個使用匿名結構執行上述操作的示例,這無疑是病態的。


i := struct{

    Data interface{} `json:"data"`

}{

    Data:struct{

        Image interface{} `json:"image"`

    } {

        Image:struct{

            Url string `json:"url"`

        }{

            Url:"test.jpg",

        },

    },

}

雖然這有效,但它非?;靵y。但請注意,您甚至可以將標簽添加到匿名類型的字段中,以便 json 格式按預期進行轉換。


另一種匿名完成并避免所有這些type定義瘋狂的方法就是使用地圖。這是那個例子。但是請注意,如果一些 Go cargo 教徒看到你map[string]interface{}到處使用,他們會對你大喊大叫。然而,無論是在實踐中還是在哲學上,它實際上都沒有錯。


j := map[string]interface{} {

    "data":map[string]interface{}{

        "image":map[string]interface{}{

            "url":"test.jpg",

        },

    },

}

但是,通常,您希望利用類型化語言可以為您提供的功能。像 Go 這樣的強類型語言非常擅長在早期發現其他微妙的錯誤。


這不是更好看嗎:


type Object map[string]interface{}


// ...


j := Object{

    "data": Object{

        "image": Object{

            "url":"test.jpg",

        },

    },

}

再次使用編碼

這是您的程序,采用更慣用的風格。在我看來,這并非巧合,也更具可讀性。


    package main


    import (

        "fmt"

        "encoding/json"

    )


    type data struct {

        Image image `json:"image"`

    }


    type image struct {

        Url string `json:"url"`

    }


    type images struct {

        Data data `json:"data"`

    }



    func main() {

        i := images{Data: data{Image: image{Url: "test.jpg"}}}


        data, _ := json.Marshal(i)

        fmt.Println(string(data))


    }

另請注意,雖然您必須導出成員以使它們出現在 json 中,但您不必自己導出類型。


查看完整回答
反對 回復 2023-03-21
  • 1 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號