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

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

Golang抽象接口切片轉換

Golang抽象接口切片轉換

Go
手掌心 2021-09-27 16:08:01
我有一個對象列表(準確地說是 olievere/Elastic SearchResult.Hits)。其中每一個都有一個json.RawMessage對象,我希望創建一個可抽象的方法,該方法接受任何結構的接口切片,Unmarshal 將每個單獨的命中“json.RawMessage放入所述結構中,并將其附加到傳入的[]interface.這個 func 不應該對所需的業務層結構有任何邏輯或洞察力,而且 DB Call 的接口非常多,因此無法看到上面提到的 Elastic 包。我試圖做的例子......foo.go    import (bar, package)type TestStruct struct {        Slice []*package.Struct // package.Struct has a value of Source which is a                                // json.RawMessage    }    func GetData() bar.Test {    return &TestStruct{*package.GetData()}}func (result TestStruct) UnmarshalStruct(v []interface{}) {        for _, singleStruct := range result.Slice {             append(json.Unmarshal(singleStruct, &v))    }第二個文件bar.gotype Handler interface {    GetData() Test}type Test interface {    UnmarshalStruct}type OtherType struct {   foo string   bar string} func RetrieveData() []OtherType {    handler := New(Handler)    test := handler.GetData()    var typeSlice []OtherType        test.UnmarshalStruct(&typeSlice)}我正在尋找某種類型的東西[]OtherType,或者我決定創建的任何其他新結構UnmarshalStruct,并讓它返回給我相同的結構,只是充滿數據例如,我要從 Elastic 搜索兩種不同類型的數據。我將收到以下兩個對象之一的列表。{ 'foo': '',  'id': }并且在不同的索引中{ 'bar': '',  'baz': '',  'eee': ''}     這些中的每一個自然需要兩個不同的結構。但是,我希望有一種方法能夠解碼這些列表中的任何一個。我將在下面給出,并使用相同的函數將其轉換為bar結構,并將其他類型轉換為foo結構。{ 'source': [    { 'bar': '',      'baz': '',      'eee': ''    },    { 'bar': '',      'baz': '',      'eee': ''    },    { 'bar': '',      'baz': '',      'eee': ''    }      ]}
查看完整描述

3 回答

?
胡說叔叔

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

如果我理解正確,您想將數據解組為兩種類型的切片:


type A struct {

  Foo string `json:"foo"`

  ID string `json:"id"`

}


type B struct {

   Bar string `json:"bar"`

   Baz string `json:"baz"`

   Eee string `json:"eee"`

}

來自SearchHit Source。


JSON 包可以為您完成大部分工作:


func executeQuery(q Query, v interface{}) error {

   // Get a SearchHit. I am making this up. 

   // I have no idea how the package works.

   searchHit, err := getHit(q) 

   if err != nil {

      return err

   }

   // This is the important part. Convert the raw message to 

   // a slice of bytes and decode to the caller's slice.

   return json.Unmarshal([]byte(*searchHit.Source), v)

}

您可以調用此函數以解碼為類型切片或指向類型的指針切片。


// Slice of type

var s1 []TypeA

if err := executeQuery(q1, &s1); err != nil {

    // handle error

}


// Slice of pointer to type

var s2 []*TypeB

if err := error(q2, &s2); err != nil {

   // handle error

}

我知道這不是問題的直接答案,但這就是通常處理這種情況的方式。


查看完整回答
反對 回復 2021-09-27
?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

我不相信這很容易做到。在godocs的原始消息示例中,他們使用 json 中的一個值,在他們的示例中為“Space”,以確定要解組的結構類型。

為此,該函數必須有某種方法來獲取為程序定義的每個結構體,然后它必須檢查每個 json 對象并使用反射將其與每個結構體進行比較以找出它的類型最有可能的是。如果有多個“可能”的結構呢?然后沖突解決使事情復雜化。

簡而言之,我不認為你可以做到這一點。


查看完整回答
反對 回復 2021-09-27
  • 3 回答
  • 0 關注
  • 334 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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