package main

import (
    "fmt"
    "encoding/json"
    "reflect"
)

func someFunc( data interface{}, out interface{} ) {
    v := reflect.ValueOf(out).Elem();
    fmt.Printf("Incoming type: %s\n",reflect.ValueOf(v).Kind())
    v.SetCap(reflect.ValueOf(data).Len())
}

func main() {
    expected := []int{1,2,3}

    jsonRaw, _ := json.Marshal(expected)
    var tmpData interface{}

    json.Unmarshal(jsonRaw, &tmpData)
    fmt.Printf("%s\n",string(jsonRaw))
    fmt.Printf("%#v\n",tmpData)

    result := []int{}
    var tmp interface{}
    tmp = result
    fmt.Printf("Outcoming type: %s\n",reflect.TypeOf(&tmp))
    someFunc(tmpData,&tmp)
}

我想对v中的someFunc参数进行操作,就好像它是
slice ,即“传入类型”-调试消息应输出slice
但是,它输出struct,如here所示。
最终目标是我使用反射来分析data -parameter的内容并将所有内容恢复为out,但是现在我想
知道如何确保检测到正确的v类型,
这样我就可以将其用作 slice

编辑:这似乎是不可能的(至少从2013年开始):https://groups.google.com/forum/#!topic/golang-nuts/bldM9tIL-JM
为运行时发现的内容设置 slice 的大小。
其中一位作者说了一些话,即“您必须能够
对元素进行排序,即对值实施Less()“...

编辑:无论如何,我确实尝试在此Playgound link中使用MakeSlice
它说reflect.MakeSlice of non-slice type
编辑:对不起,谢谢大家的评论。
我最终要做的是以下内容(在对MakeSlice的源代码进行了有启发性的阅读之后):
package main

import (
    "fmt"
    "encoding/json"
    "reflect"
)

func someFunc( data interface{}, out interface{} ) {
    v := reflect.ValueOf(out).Elem();
    fmt.Printf("Incoming type: %s\n",v.Kind())
    //v.SetCap(reflect.ValueOf(data).Len()) <-- doesn't work
    n := reflect.ValueOf(data).Len()
    s := reflect.MakeSlice(reflect.TypeOf(data),n,n)
    fmt.Printf("Len= %d\n",s.Len())
}

func main() {
    expected := []int{1,2,3}

    jsonRaw, _ := json.Marshal(expected)
    var tmpData interface{}

    json.Unmarshal(jsonRaw, &tmpData)
    fmt.Printf("%s\n",string(jsonRaw))
    fmt.Printf("%#v\n",tmpData)

    result := []int{}
    someFunc(tmpData,&result)
}

最佳答案

我最终要做的是以下内容(在对MakeSlice的源代码进行了很好的解读之后):

package main

import (
    "fmt"
    "encoding/json"
    "reflect"
)

func someFunc( data interface{}, out interface{} ) {
    v := reflect.ValueOf(out).Elem();
    fmt.Printf("Incoming type: %s\n",v.Kind())
    //v.SetCap(reflect.ValueOf(data).Len()) <-- doesn't work
    n := reflect.ValueOf(data).Len()
    s := reflect.MakeSlice(reflect.TypeOf(data),n,n)
    fmt.Printf("Len= %d\n",s.Len())
}

func main() {
    expected := []int{1,2,3}

    jsonRaw, _ := json.Marshal(expected)
    var tmpData interface{}

    json.Unmarshal(jsonRaw, &tmpData)
    fmt.Printf("%s\n",string(jsonRaw))
    fmt.Printf("%#v\n",tmpData)

    result := []int{}
    someFunc(tmpData,&result)
}

似乎也有便利功能,例如SliceOf
最重要的是MakeSlice的第一个参数不是类型
slice 所包含的参数中的一个,但 slice 类型如[]int而不是int

关于go - Golang反射片显示为结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61717306/

10-12 02:51