簡體   English   中英

在golang中動態創建結構數組

[英]Creating array of struct dynamically in golang

我嘗試創建一個通用函數,該函數接受任何結構值並創建該結構類型的數組。 這是我試過的代碼。 但我收到錯誤“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 不支持泛型,任何類似的嘗試都不會奏效。 在您的具體情況下,有幾個關鍵問題:

  • 您不能將變量用作類型。 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
}

注意:您在RegAppDB data應該是interface{}類型,因為[]int實現了interface{}而不是[]interface{}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM