-
墨色风雨
reflect 涉及包的解决方案。package mainimport ( "fmt" "reflect")func main() { var v interface{} = []string{"a", "b", "c"} var out []interface{} rv := reflect.ValueOf(v) if rv.Kind() == reflect.Slice { for i := 0; i < rv.Len(); i++ { out = append(out, rv.Index(i).Interface()) } } fmt.Println(out)}// Output:// [a b c]
-
Qyouu
我现在实际上正在处理这个问题,因为我的问题涉及从 json 对象 (map[string]interface{}) 中获取一些东西,它可能包含也可能不包含特定的键 ({"someKey": [a, b, c, ...]),如果它确实包含那个键,那么我们想要获取那个(它必然是 interface{} 类型)并将其转换为 []interface{}。到目前为止我找到的方法是使用 json marshall/unmarshall。
-
收到一只叮咚
type a map[string]interface{}type b []stringfunc main() { obj := a{ "someKey": b{"a", "b", "c"}, } if obj["someKey"] != nil { // check the value exists var someArr []interface{} //marshal interface to byte and then unmarshal to []interface{} somebytes, _ := json.Marshal(obj["someKey"]) err := json.Unmarshal(somebytes, &someArr) if err != nil { fmt.Println("Error in unmarshal") } fmt.Println(someArr) }}
-
饮歌长啸
我该如何进行转换?(如果可能,不反映)。请考虑类型开关。反射是昂贵的。func toSlice(i interface{}) []interface{} { var out []interface{} switch v := i.(type) { case []interface{}: for x := 0; x < len(v); x++ { out = append(out, v[x]) } default: fmt.Printf("invalid type: %T\n", v) } return out}
-
宝慕林4294392
接口的重点是定义你想要使用的行为,如果你使用一个空接口,你对那个切片中的类型一无所知。如果你想打印它,你可以使用 println 或 printf 没有转换。如果你想访问它,并且必须允许任何类型,你可以使用反射(使用起来缓慢且复杂)。如果您想访问它,并使用可以为其定义函数的常见行为/数据,请定义一个接口,例如:type Doer interface { Do() error}parentStruct := []Doer{...}testStruct.Do()如果这些都不起作用,请等待 Go 2 和泛型。
-
慕哥6287543
对于任何在 2022 年发现这一点的人,现在我们有了仿制药,您可以这样做:func convertSlice[T any](data []T) []interface{} { output := make([]interface{}, len(data)) for idx, item := range data { output[idx] = item } return output}