首页 > 解决方案 > Omitempty 字段不起作用,如何从响应正文中删除空结构?

问题描述

Api 响应图片链接

type PolicySpec struct {
    Description      string       `json:"description" yaml:"description"`
    EndpointSelector Selector     `json:"endpointSelector,omitempty" yaml:"ingress,omitempty"`
    Severity         int          `json:"severity,omitempty" yaml:"severity,omitempty"`
    Tags             []string     `json:"tags,omitempty" yaml:"tags,omitempty"`
    Message          string       `json:"message,omitempty" yaml:"message,omitempty"`
    Process          KubeArmorSys `json:"process,omitempty" yaml:"process,omitempty"`
    File             KubeArmorSys `json:"file,omitempty" yaml:"network,omitempty"`
    Action           string       `json:"action,omitempty" yaml:"action,omitempty"`
}

我即使在字段中添加了 omitempty 却在 yaml 和 json 中获得了空结构,如何从 api 响应正文中删除那些空结构?

标签: mysqldatabasegogo-gormdefaultifempty

解决方案


正如 Go 中 yaml 库的文档所描述的,空结构体应该用omitempty标签省略。链接 - pkg.go.dev/gopkg.in/yaml.v3

省略

         Only include the field if it's not set to the zero
         value for the type or to empty slices or maps.
         Zero valued structs will be omitted if all their public
         fields are zero, unless they implement an IsZero
         method (see the IsZeroer interface type), in which
         case the field will be excluded if IsZero returns true.

这是示例证明代码。

package main

import (
    "fmt"
    "gopkg.in/yaml.v3"
    "log"
)

type A struct {
    A int `yaml:"a"`
}

type B struct {
    B int `yaml:"b"`
    A A `yaml:"a,omitempty"`
}

func main() {
    b := B{
        B:5,
    }
    encoded, err := yaml.Marshal(b)
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Println(`encoded - `,string(encoded)) //encoded -  b: 5
}

你可以在这里运行代码


推荐阅读