gpt4 book ai didi

go - Golang反射片显示为结构

转载 作者:行者123 更新时间:2023-12-01 22:36:34 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com