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

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

如何將字節切片優雅地解碼為不同的結構

如何將字節切片優雅地解碼為不同的結構

Go
繁星coding 2022-08-01 15:19:19
var response Responseswitch wrapper.Domain {case "":    response = new(TypeA)case "TypeB":    response = new(TypeB)case "TypeC":    response = new(TypeC)case "TypeD":    response = new(TypeD)}_ = decoder.Decode(response)如代碼片段所示,我從 的字段中獲得了足夠的信息來確定響應的類型,并且對于每種類型,都執行以下操作:Domainwrapper使用創建該類型的新實例new使用解碼器將字節切片解碼為在步驟1中創建的實例,我想知道是否有辦法使第一步更加通用并擺脫switch語句。
查看完整描述

1 回答

?
翻過高山走不出你

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

關于您的代碼的一些內容

根據評論中的討論,我想分享一些經驗。


我沒有看到你的解決方案有什么不好的,但是改進它的選項很少,這取決于你想做什么。


你的代碼看起來像經典的工廠。這是一種模式,它基于一些輸入參數創建單個族的對象。Factory


在Golang中,這通常以更簡單的方式用作,有時稱為。Factory MethodFactory function


例:


type Vehicle interface {};

type Car struct {}


func NewCar() Vehicle {

   return &Car{}

}

但是您可以輕松擴展它以執行類似您的操作:


package main


import (

    "fmt"

    "strings"

)


type Vehicle interface {}

type Car struct {}

type Bike struct {}

type Motorbike struct {}


// NewDrivingLicenseCar returns a car for a user, to perform 

// the driving license exam.

func NewDrivingLicenseCar(drivingLicense string) (Vehicle, error) {

    switch strings.ToLower(drivingLicense) {

    case "car":

        return &Car{}, nil

    case "motorbike":

        return &Motorbike{}, nil

    case "bike":

        return &Bike{}, nil

    default:

        return nil, fmt.Errorf("Sorry, We are not allowed to make exam for your type of car: \"%s\"", drivingLicense)

    }

}


func main() {

    fmt.Println(NewDrivingLicenseCar("Car"))

    fmt.Println(NewDrivingLicenseCar("Tank"))

}

上面的代碼產生輸出:


&{} <nil>

<nil> Sorry, We are not allowed to make exam for your type of car: "Tank"

因此,也許您可以通過以下方式改進代碼:

  • 關閉到單個函數中,該函數采用 a 并生成stringResponse object

  • 添加一些驗證和錯誤處理

  • 給它一些合理的名字。

與工廠相關的模式很少,可以替換此模式:

  • 責任鏈

  • 調度

  • 游客

  • 依賴注入


反射?

@icza也有關于反射的評論。我同意他的觀點,這是常用的,我們無法避免代碼中的反射,因為有時事情是如此動態。

但在你的場景中,這是一個糟糕的解決方案,因為:

  • 您丟失了編譯時類型檢查

  • 添加新類型時必須修改代碼,那么為什么不在此 Factory 函數中添加新行呢?

  • 你使代碼變慢(參見參考),它增加了50%-100%的性能損失。

  • 你讓你的代碼如此不可讀和復雜

  • 您必須添加更多的錯誤處理,以涵蓋反射帶來的不小錯誤。

當然,您可以添加大量測試來涵蓋大量場景。您可以在代碼中支持 、,并且可以使用測試來覆蓋它,但是在生產代碼中,有時您可以通過,如果不捕獲它,您將收到運行時錯誤。TypeATypeBTypeCTypeXYZ

結論

你的方案沒有什么不好的,這可能是做你想做的事情的最容易讀和最簡單的方法。switch/case

參考




查看完整回答
反對 回復 2022-08-01
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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