首頁>技術>

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處理程式。他們提供的強型別輸入同時仍是“一次性”解決方案,是一個強大的工具。

20
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 程式設計踩坑路01_怎樣免費用matlab連線mongdb資料庫