使用指向反射结构的指针切片

时间:2020-10-02 12:06:15

标签: go reflection

我正在尝试使用Go进行反射,我读了几篇文章,但似乎我缺少一些基本的理解,也许你们可以清除。

我写了一个简单的应用程序来演示我要实现的目标。

通常,我希望函数接收指向结构的指针的切片作为接口类型,并使用反射将其填充数据。

再次

。这个例子似乎没什么用,但是我最小化了我想要达到的目标。我知道如何找到结构的列名,但是在那里没有问题,所以我从示例中将其删除。

这是代码:

package main

import (
    "log"
    "reflect"
    "unsafe"
)

type MyTesting struct {
    MyBool   bool
    MyFloat  float64
    MyString string
}


func addRow(dst interface{}) {
    iValue := reflect.ValueOf(dst)
    iType := reflect.TypeOf(dst)
    // getting the Struct Type (MyTesting)
    structType := iType.Elem().Elem().Elem()
    // creating an instance of MyTesting
    newStruct := reflect.New(structType)
    // getting the current empty slice
    slice := iValue.Elem()
    // appending the new struct into it
    newSlice := reflect.Append(slice,newStruct)
    // trying to set the address of the varible to the new struct ? the original var is not a pointer so something here
    // is clearly wrong. I get the PANIC here, but if i remove that line, then rows stays nil
    reflect.ValueOf(&dst).SetPointer(unsafe.Pointer(newSlice.Pointer()))
    currentPlaceForRow := newStruct.Elem()
    structField := currentPlaceForRow.FieldByName("MyString")
    structField.SetString("testing")
}

func main() {
    var rows []*MyTesting
    addRow(&rows)
    log.Print(rows)
}

因此,一般而言,该函数会获得未初始化的指向MyTesting结构的指针切片。我想在函数中创建第一个slice元素并将第一个元素中的MyString的值设置为“ testing”。

当我尝试执行它时,我得到:

panic: reflect: reflect.Value.SetPointer using unaddressable value

所以使用反射对我来说有点混乱。.任何人都可以请我阐明一下我在这里缺少什么吗? :)

1 个答案:

答案 0 :(得分:2)

您可以使用reflect.ValueOf(dst).Elem().Set(newSlice)

https://play.golang.org/p/ilDZxHc2H-x