Преобразуйте массив struct в массив строк для отображения в виде таблицы - PullRequest
2 голосов
/ 16 марта 2019

Я смотрел следующий пакет: https://github.com/olekukonko/tablewriter

И я хочу попробовать напечатать мою структуру как-то так, но я не смог преобразовать свой массив структур в массив строк, которые нужны пакету.

Итак, я попробовал что-то подобное:

func print(quakes []Quake) {
    var data [][]string

    for _, quake := range quakes {
        b, err := json.Marshal(quake)
        append(data, []string(b))
    }

    table := tablewriter.NewWriter(os.Stdout)
    table.SetHeader([]string{"Name", "Sign", "Rating"})

    for _, v := range newData {
        table.Append(v)
    }
    table.Render() // Send output
}

Моя структура землетрясения:

type Quake struct {
    Googlemapref string `json:"googlemapref"`
    Segree       string `json: "degree"`
    DataUpdate   string `json: "dataUpdate"`
    MagType      string `json:"magType"`
    ObsRegion    string `json: "obsRegion"`
    Lon          string `json:"lon"`
    Source       string `json: "source"`
    Depth        int    `json:"depth"`
    TensorRef    string `json:"tensorRef"`
    Sensed       string `json:"sensed"`
    Shakemapid   string `json:"shakemapid"`
    Time         string `json:"time"`
    Lat          string `json:"lat"`
    Shakemapref  string `json:"shakemapref"`
    Local        string `json:"local"`
    Magnitud     string `json: "magnitud"`
}

Буду признателен за помощь, так как я новичок в языке, большое спасибо

1 Ответ

0 голосов
/ 16 марта 2019

Есть несколько проблем с вашим кодом.Во-первых, функция append не добавляется на место, поэтому, где вы делаете append(data, []string(b)), результат отбрасывается, поэтому я думаю, что вы хотите вместо этого сделать data = append(data, []string(b)).

Также, выполнение json.Marshalна структуру не будет составлять кусочек строк, которые вы пытаетесь использовать как.Вместо этого он выдаст единственную строку со всеми значениями, такими как {"googlemapref":"something","depth":10}.Создатель таблиц, который вы хотите использовать, ожидает, что в таблицу будет помещен фрагмент значений, которые соответствуют заголовкам (где вы можете использовать примеры заголовков "Name", "Sign", "Rating".

Вы могли бы используйте reflect пакет, как json, чтобы заполнить поля в каждой строке, но я думаю, что это будет сложнее, чем стоит, и вам лучше просто заполнить каждую строку, вызвав соответствующие поля:

func print(quakes []Quake) {
    var data [][]string

    for _, quake := range quakes {
        row := []string{quake.Googlemapref, quake.Segree, strconv.Itoa(quake.Depth),...}
        data = append(data, row)
    }

    table := tablewriter.NewWriter(os.Stdout)
    table.SetHeader([]string{"googlemapref", "degree", "depth",...})

    for _, v := range newData {
        table.Append(v)
    }
    table.Render() // Send output
}

(я оставил ... для вас, чтобы вы заполнили другие поля самостоятельно, но включил глубину, чтобы показать, как преобразовать его в строку).

...