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/