【问题标题】:Check if a slice contains a struct with a given field value检查切片是否包含具有给定字段值的结构
【发布时间】:2014-09-05 20:33:20
【问题描述】:

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

   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 作为参数时,我发现它不可能,关于如何使上述方法适用于任何结构类型的任何想法?

【问题讨论】:

    标签: go


    【解决方案1】:

    您可以使用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 进行检查。

    【讨论】:

      猜你喜欢
      • 2015-09-03
      • 2012-11-11
      • 1970-01-01
      • 2018-03-12
      • 2017-10-04
      • 1970-01-01
      • 2015-01-30
      • 2020-09-16
      • 2013-02-10
      相关资源
      最近更新 更多