从指向类型的指针创建一个类型的切片

时间:2014-07-22 01:35:19

标签: go

尝试根据指向特定类型的指针创建一个动态设置类型的切片,所以我做了以下示例

func main() {
    var chicken *Chicken
    //create a slice of chickens
    chickens:=GetaDynamiclyTypedSlice(chicken)

    //this throws  cannot range over chickens (type *[]interface {}) and i cant figure how to create a slice using my above chicken pointer
    for _,chicken := range chickens{
        fmt.Println(chicken)
    }

}

type Chicken struct{
    Weight float64
}

func GetaDynamiclyTypedSlice(ptrItemType interface{})*[]interface {}{
    var collection []interface{}
    itemtyp := reflect.TypeOf(ptrItemType).Elem()
    for i:=0;i<1000;i++{
        //create an item of the wanted type
        item := reflect.New(itemtyp)
        //set a random float to the weight value
        item.Elem().FieldByName("Weight").SetFloat(rnd.ExpFloat64())
        collection = append(collection,&item)
    }
    return &collection
}
  • 我该怎么做才能在返回的切片上使用范围?
  • 我如何使用itemtyp作为我的切片类型?

2 个答案:

答案 0 :(得分:2)

你只需要取消引用指针(这样你就不会迭代一个指针 - 你在一个切片上迭代):

for _, chicken := range *chickens {
    // ...
}

游乐场链接:http://play.golang.org/p/NBv9sooqEV

答案 1 :(得分:2)

您的代码几乎没有问题。

  1. 您正在返回指向reflect.Value的指针,99%确定这不是您要尝试的内容。

  2. 你没有像Simon提到的那样取消引用片段。

  3. 切片是指针类型,如果出于性能原因返回*[]interface{},实际上是在伤害没有帮助。

  4. 所以让我们重写代码并优化它! (这是深夜所以,聚会的时间):

    // pass the size to preallocate the slice, also return the correct slice type.
    func GetaDynamiclyTypedSlice(ptrItemType interface{}, size int) (col []interface{}) {
        col = make([]interface{}, size)
        itemtyp := reflect.TypeOf(ptrItemType).Elem()
        for i := range col { //prettier than for i := 0; etc etc
            item := reflect.New(itemtyp)
            item.Elem().FieldByName("Weight").SetFloat(rand.ExpFloat64())
            col[i] = item.Interface() //this is the magic word, return the actual item, not reflect.Value
        }
        return
    }
    

    playground