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

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

Go:為“一組”單個(gè)結(jié)果實(shí)施 ManyDecode

Go:為“一組”單個(gè)結(jié)果實(shí)施 ManyDecode

Go
牧羊人nacy 2022-11-28 10:39:11
我已經(jīng)實(shí)現(xiàn)了一個(gè)非常簡(jiǎn)單的解碼方法(gob.Decoder現(xiàn)在使用)——這適用于單個(gè)響應(yīng)——它甚至適用于切片,但我需要實(shí)現(xiàn)一個(gè) DecodeMany 方法,它能夠解碼一組單獨(dú)的響應(yīng)(不是一片)。工作解碼方法:var v MyType_ = Decode(&v)...func Decode(v interface{}) error {   buf, _ := DoSomething() // func DoSomething() ([]byte, error)   // error handling omitted for brevity   return gob.NewDecoder(bytes.NewReader(buf)).Decode(v)}我試圖為 DecodeMany 方法做的是處理不一定是切片的響應(yīng):var vv []MyType_ = DecodeMany(&vv)...func DecodeMany(vv []interface{}) error {   for _, g := range DoSomething() { // func DoSomething() []struct{Buf []bytes}            // Use g.Buf as an individual "interface{}"      // want something like:      var v interface{} /* Somehow create instance of single vv type? */      _ = gob.NewDecoder(bytes.NewReader(g.Buf)).Decode(v)      vv = append(vv, v)   }   return}除了不編譯上面還有錯(cuò)誤:不能在 DecodeMany 的參數(shù)中使用 &vv(類型 *[]MyType 的值)作為類型 []interface{}
查看完整描述

1 回答

?
寶慕林4294392

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

如果你想修改傳遞的切片,它必須是一個(gè)指針,否則你必須返回一個(gè)新的切片。此外,如果函數(shù)被聲明為具有 type 的參數(shù)[]interface{},則只能傳遞 type 的值而不能傳遞[]interface{}其他切片類型......除非你使用泛型......


這是開(kāi)始使用 Go 1.18 中引入的泛型的完美示例。


更改DecodeMany()為通用的,T類型參數(shù)是切片元素類型:


拿指針時(shí)

func DecodeMany[T any](vv *[]T) error {

    for _, g := range DoSomething() {

        var v T

        if err := gob.NewDecoder(bytes.NewReader(g.Buf)).Decode(&v); err != nil {

            return err

        }

        *vv = append(*vv, v)

    }

    return nil

}

這是一個(gè)簡(jiǎn)單的應(yīng)用程序來(lái)測(cè)試它:


type MyType struct {

    S int64

}


func main() {

    var vv []MyType

    if err := DecodeMany(&vv); err != nil {

        panic(err)

    }

    fmt.Println(vv)

}


func DoSomething() (result []struct{ Buf []byte }) {

    for i := 3; i < 6; i++ {

        buf := &bytes.Buffer{}

        v := MyType{S: int64(i)}

        if err := gob.NewEncoder(buf).Encode(v); err != nil {

            panic(err)

        }

        result = append(result, struct{ Buf []byte }{buf.Bytes()})

    }

    return

}

此輸出(在Go Playground上嘗試):


[{3} {4} {5}]

返回切片時(shí)

如果選擇返回切片,則不必傳遞任何內(nèi)容,但需要對(duì)結(jié)果進(jìn)行賦值:


func DecodeMany[T any]() ([]T, error) {

    var result []T

    for _, g := range DoSomething() {

        var v T

        if err := gob.NewDecoder(bytes.NewReader(g.Buf)).Decode(&v); err != nil {

            return result, err

        }

        result = append(result, v)

    }

    return result, nil

}

使用它:


vv, err := DecodeMany[MyType]()

if err != nil {

    panic(err)

}

fmt.Println(vv)

在Go Playground試試這個(gè)。



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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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