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

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

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

Go
肥皂起泡泡 2023-02-21 16:30:23
我有以下代码模拟我正在处理的代码的结构。主要思想是该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


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

添加回答

举报

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