Golang 反射切片显示为结构


package main
import (
"fmt"
"encoding/json"
"reflect"
)
func someFunc( data interface{}, out interface{} ) {
v := reflect.ValueOf(out).Elem();
fmt.Printf("Incoming type: %sn",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("%sn",string(jsonRaw))
fmt.Printf("%#vn",tmpData)
result := []int{}
var tmp interface{}
tmp = result
fmt.Printf("Outcoming type: %sn",reflect.TypeOf(&tmp))
someFunc(tmpData,&tmp)
}

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

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

编辑:无论如何,我确实尝试在此Playgound链接中使用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: %sn",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= %dn",s.Len())
}
func main() {
expected := []int{1,2,3}
jsonRaw, _ := json.Marshal(expected)
var tmpData interface{}
json.Unmarshal(jsonRaw, &tmpData)
fmt.Printf("%sn",string(jsonRaw))
fmt.Printf("%#vn",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: %sn",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= %dn",s.Len())
}
func main() {
expected := []int{1,2,3}
jsonRaw, _ := json.Marshal(expected)
var tmpData interface{}
json.Unmarshal(jsonRaw, &tmpData)
fmt.Printf("%sn",string(jsonRaw))
fmt.Printf("%#vn",tmpData)
result := []int{}
someFunc(tmpData,&result)
}

似乎也有便利功能,例如SliceOf。 底线是MakeSlice的第一个参数不是类型 切片持有的参数,但切片类型,例如[]int而不是int.

最新更新