1 回答

TA貢獻2080條經(jīng)驗 獲得超4個贊
問題是您像這樣初始化制表符:
w := tabwriter.NewWriter(os.Stdout, 20, 30, 1, '\t', tabwriter.AlignRight)
第二個參數(shù)是最小單元格寬度:20,第三個參數(shù)是制表符寬度:30。這應該對應于打印制表符寬度的值。大多數(shù)系統(tǒng)使用 4 或 8 寬度來打印標簽。下一個參數(shù)告訴我們使用制表符進行對齊。在這種情況下,制表符假設 1 個打印的制表符占用 30 個空格(這就是前面的參數(shù)所說的),這會導致計算不準確。
通過使用空格而不是制表符進行填充可以簡單地消除此問題。
接下來:您必須在最后一個單元格之后使用制表符,否則制表符編寫器將不知道這是單元格的末尾,并且無法使它們正確右對齊。
展望未來:在集群循環(huán)中,您應該使用換行符,因為雖然在您的示例中每個項目只有一個集群,但如果您有更多集群,它們將打印在一行中。
提示:您可以使用tabwriter.Debugflag 來打印單元格邊框。
好的,讓我們看看您的示例,已更改為可在 Go Playground 上運行。我將使用以下測試數(shù)據(jù):
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|
將“常規(guī)”調(diào)用和制表符混合在一起可能不是一個好主意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 的情況下打印相同的內(nèi)容(在Go Playground上嘗試一下)。
- 1 回答
- 0 關注
- 187 瀏覽
添加回答
舉報