1 回答
TA贡献2080条经验 获得超4个赞
问题是您像这样初始化制表符:
w := tabwriter.NewWriter(os.Stdout, 20, 30, 1, '\t', tabwriter.AlignRight)
第二个参数是最小单元格宽度:20,第三个参数是制表符宽度:30。这应该对应于打印制表符宽度的值。大多数系统使用 4 或 8 宽度来打印标签。下一个参数告诉我们使用制表符进行对齐。在这种情况下,制表符假设 1 个打印的制表符占用 30 个空格(这就是前面的参数所说的),这会导致计算不准确。
通过使用空格而不是制表符进行填充可以简单地消除此问题。
接下来:您必须在最后一个单元格之后使用制表符,否则制表符编写器将不知道这是单元格的末尾,并且无法使它们正确右对齐。
展望未来:在集群循环中,您应该使用换行符,因为虽然在您的示例中每个项目只有一个集群,但如果您有更多集群,它们将打印在一行中。
提示:您可以使用tabwriter.Debugflag 来打印单元格边框。
好的,让我们看看您的示例,已更改为可在 Go Playground 上运行。我将使用以下测试数据:
type Cluster struct {
Name string
CurrentNodeCount int
}
type Project struct {
ProjectId string
Clusters []Cluster
}
projects := []Project{
{
ProjectId: "p1",
Clusters: []Cluster{
{Name: "p1c1", CurrentNodeCount: 2},
{Name: "p1c2", CurrentNodeCount: 3},
},
},
{
ProjectId: "p2",
Clusters: []Cluster{
{Name: "p2c1", CurrentNodeCount: 4},
{Name: "p2c2", CurrentNodeCount: 5},
},
},
}
以及处理/格式化代码:
w := tabwriter.NewWriter(os.Stdout, 20, 8, 1, ' ',
tabwriter.Debug|tabwriter.AlignRight)
for _, v := range projects {
if len(v.Clusters) == 0 {
continue
}
fmt.Println("---------------------------------------------------------")
fmt.Printf("Project\t%s\n", v.ProjectId)
fmt.Println("---------------------------------------------------------")
fmt.Fprintf(w, "Cluster\tNode Count\t\n")
for _, p := range v.Clusters {
fmt.Fprintf(w, "%s\t%d\t\n", p.Name, p.CurrentNodeCount)
}
w.Flush()
fmt.Printf("\n")
}
然后输出(在Go Playground上尝试):
---------------------------------------------------------
Project p1
---------------------------------------------------------
Cluster| Node Count|
p1c1| 2|
p1c2| 3|
---------------------------------------------------------
Project p2
---------------------------------------------------------
Cluster| Node Count|
p2c1| 4|
p2c2| 5|
将“常规”调用和制表符混合在一起可能不是一个好主意fmt,两者都打印到标准输出。
另请注意,制表符可以轻松地替换为简单的fmt格式化打印:
for _, v := range projects {
if len(v.Clusters) == 0 {
continue
}
fmt.Println("---------------------------------------------------------")
fmt.Printf("Project\t%s\n", v.ProjectId)
fmt.Println("---------------------------------------------------------")
fmt.Printf("%20s|%20s|\n", "Cluster", "Node Count")
for _, p := range v.Clusters {
fmt.Printf("%20s|%20d|\n", p.Name, p.CurrentNodeCount)
}
fmt.Printf("\n")
}
上面的代码将在不使用 tabwriter 的情况下打印相同的内容(在Go Playground上尝试一下)。
- 1 回答
- 0 关注
- 134 浏览
添加回答
举报