猿问

获取指向在 golang 中使用反射创建的结构的指针

我有以下代码模拟我正在处理的代码的结构。主要思想是该ListOf函数接收一些结构的数组,并用使用反射创建的元素填充它。结构的类型未知,因此它必须与“任何”类型一起使用,这就是参数list作为interface{}. 这部分似乎在工作:创建元素并将其附加到数组。

在附加到数组之前,必须将元素传递给SetValue需要指向结构的指针的函数,以便修改它接收的结构。

在下面的代码中,我正在模拟这个函数,它的内部逻辑是不相关的,因为 我不控制这个函数。我无法更改它,而且据我测试,如果此函数接收到指向结构的指针,它会按预期工作。

但是,我一直无法找到一种方法将指向新创建的结构的指针传递给函数SetValue。当我运行下面的代码时,出现以下错误:

恐慌:接口转换:接口 {} 是 main.MyStruct,而不是 *main.MyStruct

我的问题是,如何修改才能ListOf将 a 传递*main.MyStructSetValue函数。显然我在这里遗漏了一些简单的东西。

这是代码。您可以在 Go Playground 尝试一下。提前致谢。

package main


import (

         "fmt"

         "reflect"

)


type MyStruct struct {

     Metadata struct {

        Name string

    }

}


// Expects a pointer to an struct and modifies it

func SetValue(obj interface{}) {

    // This code mocks the logic that modifies the generic objects

    // It only shows that I need a pointer in order to modify obj

    // I don't control this logic.

    s := obj.(*MyStruct)

    s.Metadata.Name = "name"

}


func ListOf(list interface{}) {

    // type of the elements of the list (main.MyStruct)

    e := reflect.TypeOf(list).Elem().Elem()

    // new value of type main.MyStruct

    v := reflect.New(e)

    // Call SetName, here is where I need *main.MyStruct

    SetValue(v.Elem().Interface())

    // value of list used below

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

    // append new value to list

    l.Set(reflect.Append(l, v.Elem()))

}


func main() {

    list := []MyStruct{}

    ListOf(&list)

    fmt.Printf("%v", list)

}


肥皂起泡泡
浏览 138回答 1
1回答

温温酱

New返回一个带有 的值*main.MyStruct。将该值传递给 SetValue:v := reflect.New(e) SetValue(v.Interface())https://go.dev/play/p/vJwbfGj7YZF
随时随地看视频慕课网APP

相关分类

Go
我要回答