尝试检查某个切片中的结构是否包含给定字段的值,所以我写了这个
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
作为参数我发现它不可能时,任何关于如何使上述方法适用于任何结构类型的想法?
答案 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
进行检查。