检查切片是否包含具有给定字段值的结构

时间:2014-07-15 15:07:12

标签: go

尝试检查某个切片中的结构是否包含给定字段的值,所以我写了这个

   func main() {
    //test
    Objs := []Obj{{1,"xxx"},{2,"yyy"},{3,"zzz"}}
    res := containsStructFieldValue(Objs,"X",1)
    fmt.Println(res)
}


type Obj struct {
    X int
    Y string
}

func containsStructFieldValue(slice []Obj ,fieldName string,fieldValueToCheck interface {}) bool{
    for _,s := range slice{
        r := reflect.ValueOf(s)
        f := r.FieldByName(fieldName)
        if f.IsValid(){
            if f.Interface() == fieldValueToCheck{
                return true //a field with the given value exists
            }
        }
    }
    return false
}

我需要它适用于任何给定的结构类型但是当我尝试slice []interface作为参数我发现它不可能时,任何关于如何使上述方法适用于任何结构类型的想法?

1 个答案:

答案 0 :(得分:5)

您可以使用reflect范围超过interface{},例如:

func containsStructFieldValue(slice interface{} ,fieldName string,fieldValueToCheck interface {}) bool{

    rangeOnMe := reflect.ValueOf(slice)

    for i := 0; i < rangeOnMe.Len(); i++ {
        s := rangeOnMe.Index(i)
        f := s.FieldByName(fieldName)
        if f.IsValid(){
            if f.Interface() == fieldValueToCheck {
                return true
            }
        }
    }
}

请注意,我没有检查slice确实是一个片段......如果没有,这段代码会出现恐慌。如果您想避免此行为,可以使用reflect.Kind进行检查。