我有一個使用 cobra 用 Go 撰寫的 CLI,其中一個命令是從文本檔案中的用戶名串列中洗掉特定的用戶名。例如,我在一個檔案中有一個用戶名串列,
用戶1 用戶2 用戶3 用戶4 用戶5
這是我的 cobra 命令中的 Go 代碼,
Run: func(cmd *cobra.Command, args []string) {
userBlacklist, _ := cmd.Flags().GetString("blacklist-file-path")
userName, _ := cmd.Flags().GetString("user-name")
if info, err := os.Stat(userBlacklist); err == nil && !info.IsDir() {
data, err := ioutil.ReadFile(userBlacklist)
if err != nil {
logger.Fatal("Failed to read in blacklist: %s", err)
}
lines := strings.Split(string(data), "\n")
file, err := os.Create(userBlacklist)
if err != nil {
logger.Fatal("Could not overwrite blacklist file %s\n", err)
}
defer file.Close()
for _, line := range lines {
if line != userName{
if _, err := file.WriteString(line "\n"); err != nil {
logger.Fatal("Failed to write user to open blacklist file %s\n", err)
}
}
}
} else {
if err != nil {
logger.Fatal("Error stating blacklist %s\n", err )
} else {
logger.Fatal("--blacklist-file-path is a directory, not a file\n")
}
}
},
當我運行它時,例如將 userName 設定為“user3”,結果輸出檔案中確實沒有 user3。但是,它確實在檔案末尾有一個空白行“”。如果我然后運行命令要求它洗掉另一個用戶,它也會洗掉該用戶,但生成的檔案現在將在末尾有兩個空行,等等,等等。
我可以通過將第 22 行更改為來防止空白行,
if !(line == userName || line == "") {
我不明白這是怎么回事。似乎不太明智?空白行從何而來?
我在 Ubuntu 20.04、Go 版本 go1.16.5 linux/amd64 和 github.com/spf13/cobra v1.5.0
提前感謝您的任何見解。
uj5u.com熱心網友回復:
該檔案以\n. 的最后一個元素strings.Split(string(data), "\n")是空字串。程式在處理最后一個元素時將空字串添加到檔案末尾。
通過使用bufio.Scanner決議行來修復:
scanner := bufio.NewScanner(bytes.NewReader(data))
for scanner.Scan() {
line := scanner.Text()
if line != userName {
if _, err := file.WriteString(line "\n"); err != nil {
logger.Fatal("Failed to write user to open blacklist file %s\n", err)
}
}
}
uj5u.com熱心網友回復:
當您將行寫入檔案時,您將添加一個換行符:
file.WriteString(line "\n")
這就是檔案末尾的空換行符的來源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/508650.html
標籤:去
上一篇:如何使用檔案名創建切片
