从结构迭代中排除空字段

und*_*ell 0 go

我有一个将从用户输入中获取其值的结构。\n现在我只想提取具有关联值的字段名称。nil不应返回具有值的字段。我怎样才能做到这一点?

\n\n

这里\xe2\x80\x99是我的代码:

\n\n
package main\n\n\nimport "fmt"\nimport "reflect"\n\ntype Users struct {\n    Name string\n    Password string\n}\n\n\nfunc main(){\n    u := Users{"Robert", ""}\n\n    val := reflect.ValueOf(u)\n\n\n    for i := 0; i < val.NumField(); i++ {\n\n        fmt.Println(val.Type().Field(i).Name)\n\n    }\n\n\n} \n
Run Code Online (Sandbox Code Playgroud)\n\n

当前结果:

\n\n
Name\nPassword\n
Run Code Online (Sandbox Code Playgroud)\n\n

预期结果:

\n\n
Name\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

您需要编写一个函数来检查是否为空:

func empty(v reflect.Value) bool {
    switch v.Kind() {
    case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        return v.Int() == 0
    case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
        return v.Uint() == 0
    case reflect.String:
        return v.String() == ""
    case reflect.Ptr, reflect.Slice, reflect.Map, reflect.Interface, reflect.Chan:
        return v.IsNil()
    case reflect.Bool:
        return !v.Bool()
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

游乐场的例子