我正在尝试使用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
所以使用反射对我来说有点混乱。.任何人都可以请我阐明一下我在这里缺少什么吗? :)
答案 0 :(得分:2)
您可以使用reflect.ValueOf(dst).Elem().Set(newSlice)
。