将结构数组转换为字符串数组以显示为表格

时间:2019-03-16 17:52:46

标签: arrays go slice

我正在看以下包裹: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 :(得分:0)

您的代码存在一些问题。首先,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
}

(我已经将...留给您自己填写其他字段,但其中包括显示如何将其转换为字符串的深度)。