首页 > 解决方案 > 如何将接口切片更改为结构切片

问题描述

如何将接口切片设置为结构切片?

我定义接口

type IFoo interface{
  //something methods
}

我定义结构

type Foo struct{
  Id int `json:"Id"`
  //somethig fields
}

我创建了结构工厂,我想将 IFoo 切片更改为具体结构类型的切片

func FooFactory (p *[]IFoo) {
  *p = *(*[]IFoo)(unsafe.Pointer(&[]Foo{})
  //here I try something like unsafe.Pointer, reflect.SliceHeader but nothing does not works
}

然后我想将结果用于 Unmarshal json:

func main() {
  var o []IFoo
  FooFactory(&o)
  j := []byte(`[{"Id":1}, {"Id":2}]`)
  json.Unmarshal (j, &o)
  fmt.Println(o)
}

我得到 [map[Id:1] map[Id:2]] 但我想得到 [{1} {2}]

如果我将 var o 定义为 []Foo 我会得到预期的结果,但我不能使用具体的结构类型作为抽象。

怎么做?感谢和抱歉我的英语不好。

标签: gostructinterfaceslice

解决方案


我找到了解决方案

https://play.golang.org/p/syNVY0KTtM2

谢谢大家的帮助


推荐阅读