第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

golang tabwriter 格式不正確

golang tabwriter 格式不正確

Go
慕萊塢森 2023-08-14 15:12:21
我遵循關于 的常見模式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為什么每列不保持固定寬度(我認為根據(jù)相關編寫器的初始化應該是 30 個字符長?)。上面的代碼哪里配置錯誤了?編輯:我期望的是,每一列都有一個固定的,即第二列(節(jié)點數(shù))始終出現(xià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
查看完整描述

1 回答

?
犯罪嫌疑人X

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上嘗試一下)。



查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號