通过反射将“interface {}”类型转换为“interface {}”类型切片中的另一个接口

我有一个类型的切片People,我需要将此切片传递给获取类型“interface {}”的函数。People 类型“实现”了一个名为 的接口HasCustomField,但我无法在函数内进行类型转换,就像我正在做的那样:


type HasCustomField interface {

    GetCustomField() map[string]interface{}

}


type People struct {    

    Name string

    customField map[string]interface{}

}


func (c *People) GetCustomField() map[string]interface{} {

    if c.customField == nil {

        c.customField = make(map[string]interface{})

    }

    return c.customField

}


func main() {

    users := []People{{Name:"Teste"},{Name:"Mizael"}}

    ProcessCustomField(&users)

}


func ProcessCustomField(list interface{}) {

    if list != nil {

        listVal := reflect.ValueOf(list).Elem()


        if listVal.Kind() == reflect.Slice {


             for i:=0; i<listVal.Len(); i++ {

                 valueReflect := listVal.Index(i).Interface()

                 objValueFinal, ok := valueReflect.(HasCustomField)


                 if ok {

                    fmt.Println("OK")

                } else {

                    fmt.Println("NAO OK")

                }

        }

}

结果总是“不正常”,我无法进行转换,我也尝试了其他几种方法,包括GetCustomField()通过反射调用该方法,但不成功。


拉丁的传说
浏览 132回答 1
1回答

陪伴而非守候

该GetCustomField方法位于指针接收者上*People,但切片包含People值。获取切片元素的地址以使用指针接收器:valueReflect&nbsp;:=&nbsp;listVal.Index(i).Addr().Interface()&nbsp;&nbsp;//&nbsp;<--&nbsp;Addr()在操场上跑起来额外的简化:使用切片参数而不是指向切片的指针。ProcessCustomField(users)&nbsp;//&nbsp;<--&nbsp;do&nbsp;not&nbsp;take&nbsp;addr&nbsp;here ... listVal&nbsp;:=&nbsp;reflect.ValueOf(list)&nbsp;<--&nbsp;do&nbsp;not&nbsp;call&nbsp;Elem()&nbsp;here在操场上运行它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go