Как разбить структуру в Голанге в соответствии с конкретными значениями - PullRequest
0 голосов
/ 21 марта 2019

У меня есть фон Python и R, и я привык работать с фреймами данных. Если у меня есть следующая таблица:

>>> table

ID        Phone   Email Value
------------------------------
ID1  15555555555    None  None
ID2         None  3Email  None
ID3         3123  4Email   aaa

вывод двух таблиц из table будет выглядеть так:

>>> table1=table[["ID","Phone","Email"]]
>>> table1

ID        Phone   Email
------------------------
ID1  15555555555    None
ID2         None  3Email
ID3         3123  4Email

>>> table2=table[["ID","Value"]]
>>> table2

ID Value
---------
ID1  None
ID2  None
ID3   aaa

Теперь я пытаюсь добиться того же с Голангом. Ниже мой первый шаг:

package main

import (
    "fmt"

)

type Identification struct {
    ID    string
    Phone int64
    Email string
    Value string
}

func main() {
    // define slice of Identification
    var idents []Identification
    idents = append(idents, Identification{ID: "ID1", Phone: 15555555555})
    idents = append(idents, Identification{ID: "ID2", Email: "3Email"})
    idents = append(idents, Identification{ID: "ID3",   Phone:3123, Email: "4Email", Value: "aaa"})

    fmt.Println(idents)

}

Результат:

[{ID1 15555555555  } {ID2 0 3Email } {ID3 3123 3Email aaa}]

У меня вопрос, как я могу нарезать idents так же, как я делал с Python в примере?

1 Ответ

1 голос
/ 21 марта 2019

Структуры в го не могут быть разделены, все, что вы можете сделать, это сбросить значения полей, от которых вы хотите избавиться.

Вам понадобится map, чтобы достичь того, что вы видите в Python.Но Go - это типизированный язык, поэтому для хранения произвольных данных вы можете использовать тип interface{}.Поэтому вам нужно сделать это с map[string]interface{}, поскольку вы храните данные разных типов, в противном случае создайте все строки и используйте map[string]string.

Тогда для нарезки ну иди не имеет ничего в стандартном пакете для нарезки столбцов.К счастью, некоторые люди работали над пакетами с открытым исходным кодом, чтобы сделать вашу жизнь проще :) Я предлагаю вам один https://github.com/go-gota/gota

Если вам придется сделать это самостоятельно, вы можете сделать это:

package main

import "fmt"

type table []map[string]interface{}

func (t table) sliceColumns(cols ...string) table {
        // create our new resulting table
        var newTable = make(table, len(t))

        // loop through table and populate our newTable
        for i, m := range t {

                var n = make(map[string]interface{}, len(cols))
                for _, col := range cols {
                        if v, ok := m[col]; ok {
                                n[col] = v
                        }
                }

                newTable[i] = n
        }

        return newTable
}

func main() {
        // define slice of Identification
        var t = table{
                {
                        "ID":    "1",
                        "Phone": 155555,
                },
                {
                        "ID":    "2",
                        "Email": "3Email",
                },
                {
                        "ID":    "3",
                        "Email": "4Email",
                        "Value": "aaaa",
                        "Phone": "123",
                },
        }

        fmt.Println(t.sliceColumns("ID", "Phone")) // [map[ID:1 Phone:155555] map[ID:2] map[ID:3 Phone:123]]
}
...