我有以下代码模拟我正在处理的代码的结构。主要思想是该ListOf函数接收一些结构的数组,并用使用反射创建的元素填充它。结构的类型未知,因此它必须与“任何”类型一起使用,这就是参数list作为interface{}. 这部分似乎在工作:创建元素并将其附加到数组。在附加到数组之前,必须将元素传递给SetValue需要指向结构的指针的函数,以便修改它接收的结构。在下面的代码中,我正在模拟这个函数,它的内部逻辑是不相关的,因为 我不控制这个函数。我无法更改它,而且据我测试,如果此函数接收到指向结构的指针,它会按预期工作。但是,我一直无法找到一种方法将指向新创建的结构的指针传递给函数SetValue。当我运行下面的代码时,出现以下错误:恐慌:接口转换:接口 {} 是 main.MyStruct,而不是 *main.MyStruct我的问题是,如何修改才能ListOf将 a 传递*main.MyStruct给SetValue函数。显然我在这里遗漏了一些简单的东西。这是代码。您可以在 Go Playground 尝试一下。提前致谢。package mainimport ( "fmt" "reflect")type MyStruct struct { Metadata struct { Name string }}// Expects a pointer to an struct and modifies itfunc 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)}
1 回答
温温酱
TA贡献1752条经验 获得超4个赞
New
返回一个带有 的值*main.MyStruct
。将该值传递给 SetValue:
v := reflect.New(e) SetValue(v.Interface())
https://go.dev/play/p/vJwbfGj7YZF
- 1 回答
- 0 关注
- 137 浏览
添加回答
举报
0/150
提交
取消