Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何向不同类型的切片添加更多项_Go_Slice - Fatal编程技术网

Go 如何向不同类型的切片添加更多项

Go 如何向不同类型的切片添加更多项,go,slice,Go,Slice,我希望能够将特定类型的一个片段传递到一个函数中,该函数将用该类型的更多项填充它。下面是一个未编译的代码示例,它描述了我想要实现的目标: package main import ( "log" "reflect" "strings" ) type Person struct { Name,Hobbies string } type Cat struct { Name,FurColor string } func main() { people := []Person{}

我希望能够将特定类型的一个片段传递到一个函数中,该函数将用该类型的更多项填充它。下面是一个未编译的代码示例,它描述了我想要实现的目标:

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)
  }
}
gorm对象将向
cats
people
添加更多记录,即使它们是完全不同的类型。我很难深入研究gorm代码,看看他们是如何做到这一点的

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

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

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))
    }
}
func createThings(切片接口{},num int){
//获取切片的反射值。
//对Elem()的调用遵从指针。
v:=reflect.ValueOf(slicep).Elem()
//使用切片元素类型创建零值。
z:=reflect.Zero(v.Type().Elem())
对于C:= 0;C< num;C++ {
//将零值追加到切片。
v、 集合(reflect.Append(v,z))
}
}

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))
    }
}