gpt4 book ai didi

go - 检查 slice 是否包含具有给定字段值的结构

转载 作者:IT王子 更新时间:2023-10-29 01:33:55 25 4
gpt4 key购买 nike

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

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

最佳答案

您可以使用 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 是否确实是一个 slice ......如果不是,这段代码会 panic。您可以使用 reflect.Kind如果您想避免这种行为,请检查此项。

关于go - 检查 slice 是否包含具有给定字段值的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24761724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com