将结构表中的类型转换为GO中的base.FixedDataGrid

i'm having a trouble converting my struct table to fixedDataGrid, because i need my data to be a fixedDataGrid so that i can use machine learning methods from GoLearn lib.

My struct is like this:

type dataStruct struct{
    Sepal_length string
    Sepal_width string
    Petal_length string
    Petal_width string
    Species string
}

So when i get my data from my mongo db, i get them like this:

var results []dataStruct
err := col.Find(nil).All(&results)

Is there a way to convert my "results" from []dataStruct type to base.FixedDataGrid ??

CreateModel function:

func CreateModel(c echo.Context) error {
    fmt.Println("====> Entry CreateModel function");
    //var results []dataStruct
    var Success bool = false

    Db := db.MgoDb{}
    Db.Init()
    defer Db.Close()

    col := Db.C(db.TrainingDataCollection)
    var results dataStruct
    if err := col.Find(nil).All(results); err != nil {
        fmt.Println("ERROR WHILE GETTING THE TRAINING DATA")
    } else {
       //fmt.Println("Results All: ", results) 
       Success = true
    }

fmt.Println("=============",results)

//Initialises a new KNN classifier
cls := knn.NewKnnClassifier("euclidean", "linear", 2)

//Do a training-test split
trainData, testData := base.InstancesTrainTestSplit(results, 0.55)
cls.Fit(trainData)

//Calculates the Euclidean distance and returns the most popular label
predictions, err := cls.Predict(testData)

if err != nil {
    panic(err)
}

fmt.Println(predictions)

// Prints precision/recall metrics
confusionMat, err := evaluation.GetConfusionMatrix(testData, predictions)

if err != nil {
    panic(fmt.Sprintf("Unable to get confusion matrix: %s", err.Error()))
}

fmt.Println(evaluation.GetSummary(confusionMat))

return c.JSON(http.StatusOK, Success)

}

Thank you in advance for your help !

Here is how i solved the issue: Actually there is a function InstancesFromMat64(row int, col int, matrix) than creates instances from a float64 matrix, and this is what i used:

func CreateModel(c echo.Context) error {
    fmt.Println("====> Entry CreateModel function");
    var Success bool = false

    Db := db.MgoDb{}
    Db.Init()
    defer Db.Close()

    col := Db.C(db.TrainingDataCollection)
    var results dataStruct
    if err := col.Find(nil).All(&results); err != nil {
           fmt.Println("ERROR WHILE GETTING THE TRAINING DATA")
    } else {
           Success = true
     }

   Data := make([]float64, len(results*nbAttrs)

   /**** Filling the Data var with my dataset data *****/

   mat := mat64.NewDense(row,nbAttrs,Data)
   inst := base.InstancesFromMat64(row,nbAttrs,mat)

   //Selecting the class attribute for our instance
   attrs := inst.AllAttributes()
   inst.AddClassAttribute(attrs[4])

   //Initialise a new KNN classifier
   cls := knn.NewKnnClassifier("manhattan","linear",3)

   //Training-tessting split
   trainData, testData := base.InstancesTrainTestSplit(inst,0.7)

   /*******          Continue the Model creation                ******/

I'll be glad if my answer helps someone.

Thanks a lot @mkopriva for your help !

base.FixedDataGrid is an interface, so what you need to do is to implement that interface, that is, implement all of its methods, on the type you want to use as FixedDataGrid.

Since you want to use []dataStruct, a slice of dataStructs, which is an unnamed type, as FixedDataGrid you will have to declare a new type to be able to add methods to it because you can add methods only to named types. For example something like this:

type dataStructList []dataStruct

Now, if you take a look at the documentation, you can see that the FixedDataGrid interface declares two methods RowString and Size but also embeds another interface, the base.DataGrid interface, which means you need to implement the methods declared by DataGrid as well. So, given your new dataStructList type, you can do something like this:

func (l dataStructList) RowString(int) string { /* ... */ }
func (l dataStructList) Size() (int, int) { /* ... */ }
func (l dataStructList) GetAttribute(base.Attribute) (base.AttributeSpec, error)  { /* ... */ }
func (l dataStructList) AllAttributes() []base.Attribute  { /* ... */ }
func (l dataStructList) AddClassAttribute(base.Attribute) error  { /* ... */ }
func (l dataStructList) RemoveClassAttribute(base.Attribute) error  { /* ... */ }
func (l dataStructList) AllClassAttributes() []base.Attribute  { /* ... */ }
func (l dataStructList) Get(base.AttributeSpec, int) []byte  { /* ... */ }
func (l dataStructList) MapOverRows([]base.AttributeSpec, func([][]byte, int) (bool, error)) error  { /* ... */ }

After you've implemented the /* ... */ parts you can then start using dataStructList as a FixedDataGrid, so something like this:

var results []dataStruct
err := col.Find(nil).All(&results)
fdg := dataStructList(results) // you can use fdg as FixedDataGrid

Or

var results dataStructList // you can use results as FixedDataGrid
err := col.Find(nil).All(&results)

Update:

After you've implemented all of those methods on the dataStructList all you need is the type of the results variable inside your function:

func CreateModel(c echo.Context) error {
    fmt.Println("====> Entry CreateModel function")
    //var results []dataStruct
    var Success bool = false

    Db := db.MgoDb{}
    Db.Init()
    defer Db.Close()

    col := Db.C(db.TrainingDataCollection)
    var results dataStructList // <--- use the type that implements the interface
    if err := col.Find(nil).All(&results); err != nil { // <-- pass a pointer to results
        fmt.Println("ERROR WHILE GETTING THE TRAINING DATA")
    } else {
        //fmt.Println("Results All: ", results)
        Success = true
    }

    fmt.Println("=============", results)

    //Initialises a new KNN classifier
    cls := knn.NewKnnClassifier("euclidean", "linear", 2)

    //Do a training-test split
    trainData, testData := base.InstancesTrainTestSplit(results, 0.55) // <-- this will work because results if of type dataStructList, which implements the base.FixedDataGrid interface.
    cls.Fit(trainData)

    //Calculates the Euclidean distance and returns the most popular label
    predictions, err := cls.Predict(testData)

    if err != nil {
        panic(err)
    }

    fmt.Println(predictions)

    // Prints precision/recall metrics
    confusionMat, err := evaluation.GetConfusionMatrix(testData, predictions)

    if err != nil {
        panic(fmt.Sprintf("Unable to get confusion matrix: %s", err.Error()))
    }

    fmt.Println(evaluation.GetSummary(confusionMat))

    return c.JSON(http.StatusOK, Success)

}