我从导入的第三方模块的包中收到一个项目:
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)
...
只要新结构体与导入的结构体逐字段兼容,这就可以工作。