我尝试创建一个接受任何struct值的泛型函数,并创建该struct类型的数组。这是我试过的代码。但我得到错误“t不是一个类型”。我该如何实现呢。
type RegAppDB struct {
nm string
data []interface{}
}
func CreateRegTable(tbl string, rec interface{}) RegAppDB {
t := reflect.TypeOf(rec)
fmt.Println(t)
return RegAppDB{"log", []t}
}
Go不支持泛型,任何尝试做这样的事情都不会很好。在您的具体情况下,有几个关键问题:
reflect.TypeOf
)发生得太晚,无法使用你尝试的方式。[]interface{}
类型,这意味着你可以用于该字段的唯一类型是[]interface{}
。例如,[]string
是一种不同的类型,不能分配给该字段。我采取了另一条路线。需要一些美化。但这很有效。所以现在数据是一个接口数组,从调用函数我将指向结构变量的指针传递给Save函数。
type RegAppDB struct {
nm string
data []interface{}
cnt int
}
// CreateRegTable creates a data structure to hold the regression result
func CreateRegTable(tbl string) *RegAppDB {
return &RegAppDB{tbl, make([]interface{}, 20), 0}
}
// Save implements saving a record Regression application DB
func (rga *RegAppDB) Save(rec interface{}) error {
rga.data[rga.cnt] = rec
rga.cnt++
return nil
}
// Show implements showing the regression table
func (rga *RegAppDB) Show() error {
fmt.Println(rga.cnt)
for i := 0; i <= rga.cnt; i++ {
fmt.Println(rga.data[i])
}
return nil
}
// Compare compares two regression table for equality
func (rga *RegAppDB) Compare(rgt *RegAppDB) bool {
return reflect.DeepEqual(rga, rgt)
}
对于泛型类型不能这样做。如果存在固定数量的可能类型,则可以执行以下操作:
type RegAppDB struct {
nm string
data interface{}
}
func CreateRegTable(rec interface{}) RegAppDB {
switch rec.(type) {
case int:
return &RegAppDB{"log", []int{}}
case string:
return &RegAppDB{"log", []string{}}
}
return nil
}
注意:你的data
中的RegAppDB
应该是interface{}
类型,因为[]int
实现了interface{}
而不是[]interface{}