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

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

Golang抽象接口切片轉(zhuǎn)換

Golang抽象接口切片轉(zhuǎn)換

Go
手掌心 2021-09-27 16:08:01
我有一個(gè)對(duì)象列表(準(zhǔn)確地說是 olievere/Elastic SearchResult.Hits)。其中每一個(gè)都有一個(gè)json.RawMessage對(duì)象,我希望創(chuàng)建一個(gè)可抽象的方法,該方法接受任何結(jié)構(gòu)的接口切片,Unmarshal 將每個(gè)單獨(dú)的命中“json.RawMessage放入所述結(jié)構(gòu)中,并將其附加到傳入的[]interface.這個(gè) func 不應(yīng)該對(duì)所需的業(yè)務(wù)層結(jié)構(gòu)有任何邏輯或洞察力,而且 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))    }第二個(gè)文件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,或者我決定創(chuàng)建的任何其他新結(jié)構(gòu)UnmarshalStruct,并讓它返回給我相同的結(jié)構(gòu),只是充滿數(shù)據(jù)例如,我要從 Elastic 搜索兩種不同類型的數(shù)據(jù)。我將收到以下兩個(gè)對(duì)象之一的列表。{ 'foo': '',  'id': }并且在不同的索引中{ 'bar': '',  'baz': '',  'eee': ''}     這些中的每一個(gè)自然需要兩個(gè)不同的結(jié)構(gòu)。但是,我希望有一種方法能夠解碼這些列表中的任何一個(gè)。我將在下面給出,并使用相同的函數(shù)將其轉(zhuǎn)換為bar結(jié)構(gòu),并將其他類型轉(zhuǎn)換為foo結(jié)構(gòu)。{ 'source': [    { 'bar': '',      'baz': '',      'eee': ''    },    { 'bar': '',      'baz': '',      'eee': ''    },    { 'bar': '',      'baz': '',      'eee': ''    }      ]}
查看完整描述

3 回答

?
胡說叔叔

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

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


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)

}

您可以調(diào)用此函數(shù)以解碼為類型切片或指向類型的指針切片。


// 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

}

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


查看完整回答
反對(duì) 回復(fù) 2021-09-27
?
阿晨1998

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

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

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

簡(jiǎn)而言之,我不認(rèn)為你可以做到這一點(diǎn)。


查看完整回答
反對(duì) 回復(fù) 2021-09-27
  • 3 回答
  • 0 關(guān)注
  • 327 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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