我有以下代码模拟我正在处理的代码的结构。主要思想是该ListOf
函数接收一些结构的数组,并用使用反射创建的元素填充它。结构的类型未知,因此它必须与“任何”类型一起使用,这就是参数list
作为interface{}
. 这部分似乎在工作:创建元素并将其附加到数组。
在附加到数组之前,必须将元素传递给SetValue
需要指向结构的指针的函数,以便修改它接收的结构。
在下面的代码中,我正在模拟这个函数,它的内部逻辑是不相关的,因为 我不控制这个函数。我无法更改它,而且据我测试,如果此函数接收到指向结构的指针,它会按预期工作。
但是,我一直无法找到一种方法将指向新创建的结构的指针传递给函数SetValue
。当我运行下面的代码时,出现以下错误:
恐慌:接口转换:接口 {} 是 main.MyStruct,而不是 *main.MyStruct
我的问题是,如何修改才能ListOf
将 a 传递*main.MyStruct
给SetValue
函数。显然我在这里遗漏了一些简单的东西。
这是代码。您可以在 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)
}
温温酱
相关分类