我希望能够将特定类型的切片传递给一个函数,该函数将在该函数中填充更多该类型的项。这是一个代码示例,该代码未编译,但是描述了我要实现的目标:
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对象将向cats
或people
添加更多记录,即使它们是完全不同的类型。我很难深入研究gorm代码,看看他们是如何做到的。
我想知道如何更改createThings
函数,以便可以分割任何内容,然后向其中添加更多空记录。 (稍后,我将使用反射来确定结构中的可用字段,并为我制作的游戏填充随机数据。)
答案 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))
}
}