在golang

时间:2018-08-28 15:01:54

标签: go

我尝试创建一个接受任何结构值的泛型函数并创建该结构类型的数组。这是我尝试的代码。但是我收到错误消息“ 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}
}

3 个答案:

答案 0 :(得分:1)

Go不支持泛型,并且任何尝试做类似事情的尝试都不会奏效。在您的特定情况下,存在几个关键问题:

  • 您不能将变量用作类型。 Go是编译时静态类型的,因此任何在运行时获取类型信息的东西(即reflect.TypeOf)都为时已晚,无法使用您尝试的方式。
  • 同样重要的是,结构的字段的类型为[]interface{},这意味着您可以在该字段中使用的唯一类型是[]interface{}。例如,[]string是另一种类型,不能分配给该字段。

答案 1 :(得分:0)

我走了另一条路线。需要一些美化。但这有效。因此,现在数据是一个接口数组,并且从调用函数中,我将指向结构变量的指针传递给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)
}

答案 2 :(得分:0)

不能为泛型类型完成。如果存在固定数量的可能类型,则可以执行以下操作:

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