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 中,但您不必自己導出類型。
- 1 回答
- 0 關注
- 137 瀏覽
添加回答
舉報