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

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

Go:為“一組”單個結果實施 ManyDecode

Go:為“一組”單個結果實施 ManyDecode

Go
牧羊人nacy 2022-11-28 10:39:11
我已經實現了一個非常簡單的解碼方法(gob.Decoder現在使用)——這適用于單個響應——它甚至適用于切片,但我需要實現一個 DecodeMany 方法,它能夠解碼一組單獨的響應(不是一片)。工作解碼方法: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 方法做的是處理不一定是切片的響應: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}除了不編譯上面還有錯誤:不能在 DecodeMany 的參數中使用 &vv(類型 *[]MyType 的值)作為類型 []interface{}
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

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


這是開始使用 Go 1.18 中引入的泛型的完美示例。


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


拿指針時

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

}

這是一個簡單的應用程序來測試它:


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}]

返回切片時

如果選擇返回切片,則不必傳遞任何內容,但需要對結果進行賦值:


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試試這個。



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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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