Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengalih keluar item tertentu daripada struktur yang diterima oleh pakej yang diimport dalam golang?

Bagaimana untuk mengalih keluar item tertentu daripada struktur yang diterima oleh pakej yang diimport dalam golang?

WBOY
WBOYke hadapan
2024-02-06 08:40:06977semak imbas

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

Kandungan soalan

Saya menerima projek daripada pakej modul pihak ketiga yang diimport:

myitem := importpackage.get()

Ia adalah struktur seperti ini:

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"`
}

Saya mahu memadamkan satu atau lebih daripadanya dan mengembalikannya sebagai json daripada golang gin api saya:

c.json(200, &myitem)

Masalahnya ialah cuba mencari penggunaan sumber yang paling cekap untuk melakukan ini.

Saya terfikir untuk membuat gelung dan menulis medan yang saya perlukan ke dalam struktur baharu:

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

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

c.json(200, &hostlist)

Saya juga mempertimbangkan marshalling dan kemudian unmarshaling untuk menetapkannya kepada struct lain sebelum mengembalikannya melalui 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)

Saya berharap dapat mencari cara yang lebih cekap untuk melakukan ini. myitem Boleh mempunyai lebih 3 juta baris json dan gelung melalui segala-galanya, atau marshalling dan unmarshaling nampaknya melibatkan lebih banyak proses, kemudian hanya melaksanakan sesuatu yang agak mudah.

EDIT: Strukturnya ialah kepingan ([]).


Jawapan betul


Tentukan struktur baharu yang merupakan salinan struktur sedia ada anda dengan label berbeza:

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"`
}

Kemudian, gunakan struktur baharu ini untuk mengawal:

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

Ini akan berfungsi selagi struktur baharu serasi medan demi medan dengan struktur yang diimport.

Atas ialah kandungan terperinci Bagaimana untuk mengalih keluar item tertentu daripada struktur yang diterima oleh pakej yang diimport dalam golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam