为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
拉丁的传说 2023-08-07 15:23:18
我有一个类型的切片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()通过反射调用该方法,但不成功。
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

GetCustomField方法位于指针接收者上*People,但切片包含People值。获取切片元素的地址以使用指针接收器:

valueReflect := listVal.Index(i).Addr().Interface()  // <-- Addr()

在操场上跑起来

额外的简化:使用切片参数而不是指向切片的指针。

ProcessCustomField(users) // <-- do not take addr here
...

listVal := reflect.ValueOf(list) <-- do not call Elem() here

在操场上运行它


查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信