go - 将值转换为结构

标签 go go-reflect

我有一个结构如下

type pathObject struct {
    s      *gizmo.Session
    finals bool
    path   *path.Path
}

我得到了这个结构,我需要提取路径对象,但我一直收到编译错误

这是我的转换代码

r := reflect.ValueOf(v)

for i := 0; i < val.NumField(); i++ {
    valueField := val.Field(i)
    typeField := val.Type().Field(i)
    val.Interface()

    if typeField.Name == "path" {
        log.Printf("typeName %v\n", typeField.Name)
        log.Printf("value %v\n", valueField)

        f := reflect.Indirect(r).FieldByName("path")

        log.Printf("CanInterface %v\n", valueField.Elem())
        p := valueField.Elem().(path.Path)

        //patObject := reflect.Indirect(valueField).FieldByName("path")

    }
    //f := valueField.Interface()
    //val := reflect.ValueOf(f)
    //slog.Printf("default %v\n", val)
}

我在这一行遇到编译错误 p := valueField.Elem().(path.Path) 说

invalid type assertion: valueField.Elem().(path.Path) (non-interface type reflect.Value on left)

关于如何克服错误并使其转换的任何线索?

最佳答案

断言调用 reflect.Value Interface() method 的结果的类型. Interface() 方法返回实际值。

p := valueField.Elem().Interface().(path.Path)

必须导出路径字段才能访问值:

type pathObject struct {
    s      *gizmo.Session
    finals bool
    Path   *path.Path
}

试试这个更简单的代码:

func getPath(v interface{}) *path.Path {
    r := reflect.Indirect(reflect.ValueOf(v))
    f := r.FieldByName("Path")
    return f.Interface().(*path.Path)
}

playground example

关于go - 将值转换为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47189580/

相关文章:

go - 使用反射将字节读入结构

pointers - 为什么返回类型实际上是error 还需要返回一个指针?

go - 从 Golang 中的函数列表中选择一个函数

go - 如何在 Go 中获取结构的方法列表?

go - 在 Go 中,如何在运行时从其类型创建一个新的结构实例?

python - 什么是正确的Ctypes通过数组

recursion - 递归遍历嵌套结构

go - 使用 Go reflect 实例化一个新的 obj 并在接口(interface)中输入 assert

go - 在 Go 中按名称调用结构及其方法?

mongodb - 如何检索具有匹配属性的对象数组的 mongo 文档