如何将更多项目添加到各种类型的切片中

时间:2018-08-28 14:03:07

标签: go slice

我希望能够将特定类型的切片传递给一个函数,该函数将在该函数中填充更多该类型的项。这是一个代码示例,该代码未编译,但是描述了我要实现的目标:

package main

import (
  "log"
  "reflect"
  "strings"
)
type Person struct {
  Name,Hobbies string
}
type Cat struct {
  Name,FurColor string
}
func main() {

  people := []Person{}
  createThings(&people,10)
  log.Println(people)

  cats := []Cat{}
  createThigns(&cats,5)
  log.Println(cats)
}
func createThings(slice interface{},num int) {
  b := strings.Replace(reflect.TypeOf(slice).String(),"*[]main.","",-1)
  log.Println(b)
  for c:=0;c<num;c++ {
    eval("item := "+b+"{}")
    *slice = append(*slice,item)
  }
}

本质上,语句eval("item := "+b+"{}")是我将在允许它的其他编程语言中完成的工作,但是据我了解,golang并不是什么意思。

我在http://gorm.io的文档中看到了类似的内容,您可以执行以下操作:

cats := []Cat{}
db.Find(&cats)
people :=[]Person{}
db.Find(&people)

gorm对象将向catspeople添加更多记录,即使它们是完全不同的类型。我很难深入研究gorm代码,看看他们是如何做到的。

我想知道如何更改createThings函数,以便可以分割任何内容,然后向其中添加更多空记录。 (稍后,我将使用反射来确定结构中的可用字段,并为我制作的游戏填充随机数据。)

1 个答案:

答案 0 :(得分:3)

使用reflect包将元素附加到任何类型的切片上。

func createThings(slicep interface{}, num int) {
    // Get reflect value for the slice. 
    // The call to Elem() deferences the pointer.
    v := reflect.ValueOf(slicep).Elem()

    // Create a zero value using the slice element type.
    z := reflect.Zero(v.Type().Elem())

    for c := 0; c < num; c++ {
        // Append zero value to slice.
        v.Set(reflect.Append(v, z))
    }
}

Run it on the playground.