【问题标题】:Check if struct fields are not empty检查结构字段是否不为空
【发布时间】:2021-08-05 16:07:10
【问题描述】:

如何遍历结构中的字段并检查它们是否不为空而不显式?

我有一个示例结构

type Example struct {
    Foo, Bar string
}

我可以明确检查每个字段是否不是“”,但我不想这样做。有什么简单的方法可以完成我需要的吗?

【问题讨论】:

标签: go struct


【解决方案1】:

如果要检查是否所有字段的值都为零,您可以简单地检查

var foo Example
if foo == (Example{}) {
  // ...
}

go 用零值初始化所有结构字段(如果是字符串,则为空字符串"")。请记住,如果结构具有不可比较类型(即类型指针、切片或映射)的字段,这可能无法按预期工作。

您可以使用reflect.Value 的方法来迭代字段并比较值(就像reflect.DeepEqual() 一样)。但在大多数情况下,最好简单地编写一个明确执行检查的函数。

【讨论】:

    【解决方案2】:

    我建议你使用反射包,建议mkopriva。编写一次并将其用于您需要的所有结构。 例如,我改编了一个发现here

    func IsEmpty(object interface{}) (bool, error) {
    //First check normal definitions of empty
    if object == nil {
        return true, nil
    } else if object == "" {
        return true, nil
    } else if object == false {
        return true, nil
    }
    //Then see if it's a struct
    if reflect.ValueOf(object).Kind() == reflect.Struct {
        // and create an empty copy of the struct object to compare against
        empty := reflect.New(reflect.TypeOf(object)).Elem().Interface()
        if reflect.DeepEqual(object, empty) {
            return true, nil
        } else {
            return false, nil
        }
    }
    return false, errors.New("Check not implementend for this struct")  }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多