登录
首页 >  Golang >  Go问答

获取指向在golang中使用reflect创建的结构体的指针

来源:stackoverflow

时间:2024-04-09 23:09:39 408浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《获取指向在golang中使用reflect创建的结构体的指针》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我有以下代码来模拟我正在处理的代码的结构。主要思想是 listof 函数接收某个结构体的数组,并用使用反射创建的元素填充它。结构的类型未知,因此它必须适用于“任何”类型,这就是 list 参数作为 interface{} 传递的原因。这部分似乎正在工作:创建元素并将其附加到数组中。

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

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

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

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

我的问题是,如何修改 listof 以便能够将 *main.mystruct 传递给 setvalue 函数。显然我在这里错过了一些简单的东西。

这是代码。您可以在 go 演示中尝试一下。提前致谢。

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)
}

正确答案


new 返回一个带有 *main.mystruct 的值。将该值传递给 setvalue:

v := reflect.New(e)
SetValue(v.Interface())

https://go.dev/play/p/vJwbfGj7YZF

理论要掌握,实操不能落!以上关于《获取指向在golang中使用reflect创建的结构体的指针》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>