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



我从导入的第三方模块的包中收到一个项目:

myItem := importedPackage.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,并通过它所有的循环,或编组和解组似乎涉及更多的进程,然后它只需要实现一些相对简单的东西。

编辑:struct是一个slice([])。

定义一个新的结构体,它是现有结构体的副本,带有不同的标签:

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)
...

只要新结构体与导入的结构体逐字段兼容,这就可以工作。

相关内容

  • 没有找到相关文章

最新更新