第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何將字節(jié)切片優(yōu)雅地解碼為不同的結(jié)構(gòu)

如何將字節(jié)切片優(yōu)雅地解碼為不同的結(jié)構(gòu)

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)如代碼片段所示,我從 的字段中獲得了足夠的信息來(lái)確定響應(yīng)的類(lèi)型,并且對(duì)于每種類(lèi)型,都執(zhí)行以下操作:Domainwrapper使用創(chuàng)建該類(lèi)型的新實(shí)例new使用解碼器將字節(jié)切片解碼為在步驟1中創(chuàng)建的實(shí)例,我想知道是否有辦法使第一步更加通用并擺脫switch語(yǔ)句。
查看完整描述

1 回答

?
翻過(guò)高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊

關(guān)于您的代碼的一些內(nèi)容

根據(jù)評(píng)論中的討論,我想分享一些經(jīng)驗(yàn)。


我沒(méi)有看到你的解決方案有什么不好的,但是改進(jìn)它的選項(xiàng)很少,這取決于你想做什么。


你的代碼看起來(lái)像經(jīng)典的工廠。這是一種模式,它基于一些輸入?yún)?shù)創(chuàng)建單個(gè)族的對(duì)象。Factory


在Golang中,這通常以更簡(jiǎn)單的方式用作,有時(shí)稱(chēng)為。Factory MethodFactory function


例:


type Vehicle interface {};

type Car struct {}


func NewCar() Vehicle {

   return &Car{}

}

但是您可以輕松擴(kuò)展它以執(zhí)行類(lèi)似您的操作:


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"))

}

上面的代碼產(chǎn)生輸出:


&{} <nil>

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

因此,也許您可以通過(guò)以下方式改進(jìn)代碼:

  • 關(guān)閉到單個(gè)函數(shù)中,該函數(shù)采用 a 并生成stringResponse object

  • 添加一些驗(yàn)證和錯(cuò)誤處理

  • 給它一些合理的名字。

與工廠相關(guān)的模式很少,可以替換此模式:

  • 責(zé)任鏈

  • 調(diào)度

  • 游客

  • 依賴(lài)注入


反射?

@icza也有關(guān)于反射的評(píng)論。我同意他的觀點(diǎn),這是常用的,我們無(wú)法避免代碼中的反射,因?yàn)橛袝r(shí)事情是如此動(dòng)態(tài)。

但在你的場(chǎng)景中,這是一個(gè)糟糕的解決方案,因?yàn)椋?/p>

  • 您丟失了編譯時(shí)類(lèi)型檢查

  • 添加新類(lèi)型時(shí)必須修改代碼,那么為什么不在此 Factory 函數(shù)中添加新行呢?

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

  • 你讓你的代碼如此不可讀和復(fù)雜

  • 您必須添加更多的錯(cuò)誤處理,以涵蓋反射帶來(lái)的不小錯(cuò)誤。

當(dāng)然,您可以添加大量測(cè)試來(lái)涵蓋大量場(chǎng)景。您可以在代碼中支持 、,并且可以使用測(cè)試來(lái)覆蓋它,但是在生產(chǎn)代碼中,有時(shí)您可以通過(guò),如果不捕獲它,您將收到運(yùn)行時(shí)錯(cuò)誤。TypeATypeBTypeCTypeXYZ

結(jié)論

你的方案沒(méi)有什么不好的,這可能是做你想做的事情的最容易讀和最簡(jiǎn)單的方法。switch/case

參考




查看完整回答
反對(duì) 回復(fù) 2022-08-01
  • 1 回答
  • 0 關(guān)注
  • 121 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)