2012-09-07 73 views
57

我試圖從控制檯(包括空白)讀取整行,然後對其進行處理。使用bufio.ReadString,換行符與輸入一起讀,所以我想出了下面的代碼來修剪換行符:在Go中提取子字符串

input,_:=src.ReadString('\n') 
inputFmt:=input[0:len(input)-2]+"" //Need to manually add end of string 

有沒有一種更地道的方式來做到這一點?也就是說,在爲你提取子字符串時,是否已經有一個庫負責結束空字節?

(是的,我已經知道有一種方法來讀取一行沒有go readline -> string換行符但我正在尋找更優雅的字符串操作。)

回答

70

它看起來像你被工作弄得切片和字符串存儲格式,你在C.具有從不同的

  • 在進入賣場任何切片長度(以字節爲單位),所以你不必關心len成本操作:無需計數
  • Go字符串不爲空termi因此您不必刪除空字節,並且您不必在添加空字符串切片後添加1

要刪除的最後一個字符(如果它是一個單字節字符),根本就

inputFmt:=input[0:len(input)-1] 

而且由烏列如注意到,可以縮短隨着

inputFmt:=input[:len(input)-1] 
+7

你甚至不需要0(或者:),'s = s [:len(s)-1]'。 – uriel

+1

非常感謝您澄清;看起來在ReadString函數返回的字符串末尾有_two_空白字符,所以我誤認爲空字符是空字符。對不起C字符串的混淆;我和bufio一起使用fmt,導致控制檯中出現有趣的東西,所以我認爲它可能是髒的空字節。只是最後的澄清 - ReadString中額外的空白是什麼? – mark2222

+0

好吧我會回答我自己的問題 - 這是\ r然後\ n:P有趣的控制檯輸出是因爲我輸出\ r沒有\ n。 – mark2222

14

轉到字符串非空終止,並刪除字符串的最後一個字符,你可以簡單地做:

s = s[:len(s)-1] 
+0

這是不正確的,會導致錯誤。這會將字符串中的最後一個*字節除去,這可能導致UTF-8無效(或其他多字節編碼)。 –

+0

查看https://play.golang.org/p/K3HBBtj4Oi瞭解這種情況的一個例子。 –

7

爲了避免零長度輸入恐慌,如果包裹在所述截斷操作

input, _ := src.ReadString('\n') 
var inputFmt string 
if len(input) > 0 { 
    inputFmt = input[:len(input)-1] 
} 
// Do something with inputFmt