从struct迭代中排除空字段

时间:2014-12-01 05:07:14

标签: go

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

这是我的代码:

package main


import "fmt"
import "reflect"

type Users struct {
    Name string
    Password string
}


func main(){
    u := Users{"Robert", ""}

    val := reflect.ValueOf(u)


    for i := 0; i < val.NumField(); i++ {

        fmt.Println(val.Type().Field(i).Name)

    }


} 

当前结果:

Name
Password

预期结果:

Name

2 个答案:

答案 0 :(得分:4)

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

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
}

playground example

答案 1 :(得分:0)

我想我找到了解决方案。案件结案。 :)

import "fmt"
import "reflect"

type Users struct {
    Name string
    Password string
}


func main(){
    u := Users{"robert", ""}

    val := reflect.ValueOf(u)

    var fFields []string

    for i := 0; i < val.NumField(); i++ {
    f := val.Field(i)

    if f.Interface() != "" {
        fFields = append(fFields, val.Type().Field(i).Name)
    }

    }

   fmt.Println(fFields)
}

http://play.golang.org/p/QVIJaNXGQB