首頁  >  文章  >  後端開發  >  如何從 golang 匯入的套件接收的結構中刪除某些項目?

如何從 golang 匯入的套件接收的結構中刪除某些項目?

WBOY
WBOY轉載
2024-02-06 08:40:06976瀏覽

如何从 golang 中导入的包接收的结构中删除某些项目?

問題內容

我從匯入的第三方模組的套件中收到一個項目:

myitem := importpackage.get()

它是一個像這樣的結構:

type importedstruct struct {
    ip                  net.ip                  `json:"ip"`
    index               uint32                  `json:"index"`
    localindex          uint32                  `json:"localindex"`
    remoteindex         []*udp.addr             `json:"remoteindex"`
    certificates        *certificates           `json:"certificates"`
    vpnaddress          []iputil.vpnip          `json:"vpnaddress"`
}

我想刪除其中的一項或多項,然後再從我的 golang gin api 以 json 形式返回:

c.json(200, &myitem)

問題是試圖找到最有效的資源利用方式來做到這一點。

我考慮了一個循環並將我需要的字段寫入一個新結構:

newitem := make([]importedstruct, len(myitem))

i := 0
for _, v := range myitem {
    newitem[i] = ...
    ...
}

c.json(200, &hostlist)

我還考慮過編組,然後解組以將其分配給另一個結構,然後再透過 api 返回它:

// Marshal the host map to json
marshaledJson, err := json.Marshal(newItem)
if err != nil {
    log.Error(err)
    c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
    return
}

// Unmarshal the json into structs
var unmarshalledJson []ImportedStruct
err = json.Unmarshal(marshaledJson, &unmarshalledJson)
if err != nil {
    log.Error(err)
    c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
    return
}

// Return the modified host map
c.JSON(200, &unmarshalledJson)

我希望找到一種更有效的方法來做到這一點。 myitem 可能包含超過 300 萬行 json,並循環遍歷所有內容,或者編組和解組似乎涉及更多進程,然後只需要實現相對簡單的東西。

編輯:這個結構是一個切片 ([])。


正確答案


定義一個新結構,它是您現有結構的副本,並帶有不同的標籤:

type importedstructmarshal struct {
    ip                  net.ip                  `json:"ip"`
    index               uint32                  `json:"index"`
    localindex          uint32                  `json:"-"`
    remoteindex         []*udp.addr             `json:"remoteindex"`
    certificates        *certificates           `json:"certificates"`
    vpnaddress          []iputil.vpnip          `json:"vpnaddress"`
}

然後,使用這個新結構來編組:

var input ImportedStruct
forMarshal:=ImportedStructMarshal(input)
...

只要新結構與導入的結構逐個欄位相容,這就會起作用。

以上是如何從 golang 匯入的套件接收的結構中刪除某些項目?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除