Golang的匿名結構是什麼?
匿名結構就像普通結構一樣,但是它沒有名稱定義,因此不能在程式碼的其他地方引用。Go中的結構類似於C等其他語言中的結構。它們是欄位的型別化集合,用於將資料分組在一起,以使我們作為程式設計師更易於管理。要建立匿名結構,只需在宣告型別後立即例項化例項:
newCar := struct { make string model string mileage int}{ make: "Ford", model: "Taurus", mileage: 200000,}
將其與建立結構的“常規”方式進行對比:
// declare the 'car' struct typetype car struct { make string model string mileage int}// create an instance of a carnewCar := car{ make: "Ford", model: "taurus", mileage: 200000,}
什麼時候應該使用匿名結構?
我經常使用匿名結構在HTTP處理程式中封裝和解封JSON資料。如果一個結構只打算被使用一次,那麼以這樣一種方式宣告它是有意義的,即使得開發人員不會試圖再次使用它。看下面的程式碼。我們能夠將HTTP請求直接解析到newCar結構中,而無需給結構命名。仍然可以透過點運算子訪問所有欄位,但是我們不必擔心專案的另一部分嘗試使用非預期型別。
func createCarHandler(w http.ResponseWriter, req *http.Request) { defer req.Body.Close() decoder := json.NewDecoder(req.Body) newCar := struct { Make string `json:"make"` Model string `json:"model"` Mileage int `json:"mileage"` }{} err := decoder.Decode(&newCar) if err != nil { log.Println(err) return } makeCar(newCar.Make, newCar.Model, newCar.Mileage) return}
map[string]interface{}如果可以避免,請不要用於JSON資料。我經常看到使用map[string]interface{},而不是宣告用於JSON解組的快速匿名結構。在大多數情況下,這是很糟糕的,原因如下:
1、沒有型別檢查。如果客戶端傳送稱為“Model”的金鑰作為bool,但應該是string,則解析到map中將無法捕獲錯誤2、map是模糊的。解析資料後,我們被迫使用執行時檢查來確保我們關心的資料存在。如果這些檢查不徹底,則可能導致丟擲nil指標取消引用panic。3、map[string]interface{}很冗長。深入研究map並不像使用點運算子訪問命名欄位那樣簡單newCar.model。相反,它類似於:func createCarHandler(w http.ResponseWriter, req *http.Request) { myMap := map[string]interface{}{} decoder := json.NewDecoder(req.Body) err := decoder.Decode(&myMap) if err != nil { log.Println(err) return } model, ok := myMap["model"] if !ok { fmt.Println("field doesn't exist") return } modelString, ok := model.(string) if !ok { fmt.Println("model is not a string") } // do something with model field}
如果使用正確,匿名結構可以清理您的API處理程式。他們提供的強型別輸入同時仍是“一次性”解決方案,是一個強大的工具。
最新評論