1 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
這里有許多容易混淆的問(wèn)題。
輸出:
首先也是最重要的是您沒(méi)有指定任何特定的輸出格式。使用 fmt.Println 輸出數(shù)據(jù)結(jié)構(gòu)實(shí)際上只是為了方便調(diào)試,格式非常隨意,如果使用fmt.Printf("%#v\n", i). 默認(rèn)的 Println 輸出 Printf 的“%v”的等價(jià)物。
要獲得特定格式的輸出(Go 本身除外),您需要導(dǎo)入一個(gè)可以生成該格式的包。幸運(yùn)的是,標(biāo)準(zhǔn)庫(kù)中包含了一些流行的格式。但在我們開(kāi)始之前,還有一些其他的事情需要解決/理解。
出口:
結(jié)構(gòu)的大寫成員是導(dǎo)出的小寫成員不是。這意味著圖像結(jié)構(gòu)中的“url”必須大寫,否則諸如此類的包encoding/json將無(wú)法訪問(wèn)該成員以將其導(dǎo)出。
匿名類型:
其他人強(qiáng)調(diào)為整體結(jié)構(gòu)中的每個(gè)結(jié)構(gòu)化數(shù)據(jù)類型創(chuàng)建顯式定義,我認(rèn)為這通常是個(gè)好建議。然而,有那么多一次性的類型定義四處飄蕩也常常是愚蠢的,所以在語(yǔ)言中使用內(nèi)聯(lián)匿名結(jié)構(gòu)定義是完全可以接受的。另外一個(gè)很好的接觸是結(jié)構(gòu)相同的匿名類型被接受為與定義類型不同的相同類型。
這是一個(gè)使用匿名結(jié)構(gòu)執(zhí)行上述操作的示例,這無(wú)疑是病態(tài)的。
i := struct{
Data interface{} `json:"data"`
}{
Data:struct{
Image interface{} `json:"image"`
} {
Image:struct{
Url string `json:"url"`
}{
Url:"test.jpg",
},
},
}
雖然這有效,但它非常混亂。但請(qǐng)注意,您甚至可以將標(biāo)簽添加到匿名類型的字段中,以便 json 格式按預(yù)期進(jìn)行轉(zhuǎn)換。
另一種匿名完成并避免所有這些type定義瘋狂的方法就是使用地圖。這是那個(gè)例子。但是請(qǐng)注意,如果一些 Go cargo 教徒看到你map[string]interface{}到處使用,他們會(huì)對(duì)你大喊大叫。然而,無(wú)論是在實(shí)踐中還是在哲學(xué)上,它實(shí)際上都沒(méi)有錯(cuò)。
j := map[string]interface{} {
"data":map[string]interface{}{
"image":map[string]interface{}{
"url":"test.jpg",
},
},
}
但是,通常,您希望利用類型化語(yǔ)言可以為您提供的功能。像 Go 這樣的強(qiáng)類型語(yǔ)言非常擅長(zhǎng)在早期發(fā)現(xiàn)其他微妙的錯(cuò)誤。
這不是更好看嗎:
type Object map[string]interface{}
// ...
j := Object{
"data": Object{
"image": Object{
"url":"test.jpg",
},
},
}
再次使用編碼
這是您的程序,采用更慣用的風(fēng)格。在我看來(lái),這并非巧合,也更具可讀性。
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))
}
另請(qǐng)注意,雖然您必須導(dǎo)出成員以使它們出現(xiàn)在 json 中,但您不必自己導(dǎo)出類型。
- 1 回答
- 0 關(guān)注
- 147 瀏覽
添加回答
舉報(bào)