亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

golang tabwriter 格式不正確

golang tabwriter 格式不正確

Go
陪伴而非守候 2022-04-26 14:10:28
我遵循關于's的常見模式gotabwriter其中相關編寫器被初始化并用于將格式化輸出打印到標準輸出。這是我的代碼片段:w := tabwriter.NewWriter(os.Stdout, 20, 30, 1, '\t', tabwriter.AlignRight)for _, v := range listProjectsResponse.Projects {    parent := fmt.Sprintf("projects/%s/locations/-", v.ProjectId)    resp, err := containerService.Projects.Locations.Clusters.List(parent).Do()    if err != nil {        log.Fatalf(err.Error())    }    if len(resp.Clusters) > 0 {        fmt.Println("---------------------------------------------------------")        fmt.Printf("Project\t%s\n", v.ProjectId)        fmt.Println("---------------------------------------------------------")        fmt.Fprintf(w, "Cluster\t\tNode Count\n")        //w.Flush()        for _, p := range resp.Clusters {            fmt.Fprintf(w, "%s\t%d\t", p.Name, p.CurrentNodeCount)            //w.Flush()        }        w.Flush()        fmt.Printf("\n")    }}但是,似乎沒有遵守列之間的共同距離,如以下輸出所示:Project my-project-1---------------------------------------------------------Cluster         Node Countmy-cluster-1  3---------------------------------------------------------Project my-project-2---------------------------------------------------------Cluster         Node Countmy-newest-project-1       2---------------------------------------------------------Project my-project-3---------------------------------------------------------Cluster         Node Countanothercluster 1為什么每列不保持固定寬度(我假設基于相關編寫器的初始化應該是 30 個字符長?)。上面代碼中的錯誤配置在哪里?編輯:我所期望的是,每一列都有一個固定的,即第二列(節點數)總是出現在與Project my-project-1---------------------------------------------------------Cluster         Node Countmy-cluster-1              3---------------------------------------------------------Project my-project-2---------------------------------------------------------Cluster          Node Countmy-newest-project-1       2---------------------------------------------------------Project my-project-3---------------------------------------------------------Cluster         Node Countanothercluster           1
查看完整描述

1 回答

?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

問題是您像這樣初始化制表符:


w := tabwriter.NewWriter(os.Stdout, 20, 30, 1, '\t', tabwriter.AlignRight)

第二個參數是最小單元格寬度:20,第三個是選項卡寬度:30。這應該對應于打印標簽寬度的值。大多數系統使用 4 或 8 寬度來打印標簽。下一個參數告訴使用制表符進行對齊。在這種情況下,制表符假設 1 個打印的制表符占用 30 個空格(這就是前面的參數所說明的),這會導致計算不準確。

通過使用空格而不是制表符進行填充,可以簡單地消除此問題。


下一步:您必須在最后一個單元格之后使用制表符,否則制表符將不知道它是單元格的結尾并且無法使它們正確右對齊。


展望未來:在集群循環中,您應該使用換行符,因為雖然在您的示例中每個項目只有一個集群,但如果您有更多,它們將打印在一行中。


還有一個提示:您可以使用tabwriter.Debug標志來打印單元格邊框。


好的,讓我們看看您的示例,更改為可在 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,兩者都打印到標準輸出。


另請注意,tabwriter 可以很容易地用簡單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")

}


查看完整回答
反對 回復 2022-04-26
  • 1 回答
  • 0 關注
  • 337 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號