尝试根据指向特定类型的指针创建一个动态设置类型的切片,所以我做了以下示例
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
}
答案 0 :(得分:2)
你只需要取消引用指针(这样你就不会迭代一个指针 - 你在一个切片上迭代):
for _, chicken := range *chickens {
// ...
}
答案 1 :(得分:2)
您的代码几乎没有问题。
您正在返回指向reflect.Value
的指针,99%确定这不是您要尝试的内容。
你没有像Simon提到的那样取消引用片段。
切片是指针类型,如果出于性能原因返回*[]interface{}
,实际上是在伤害没有帮助。
所以让我们重写代码并优化它! (这是深夜所以,聚会的时间):
// 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
}