Go 中「reader.ReadString」問題排查
在Go 中,bufio.Reader 提供了ReadString 方法來從流,在指定方法來從流的分隔符號處停止。但是,當使用此方法檢索使用者輸入時,有時會發現第一次出現的分隔符號並未從傳回的字串中刪除。
請考慮以下程式碼:
package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Who are you? \nEnter your name: ") text, _ := reader.ReadString('\n') if aliceOrBob(text) { fmt.Printf("Hello, ", text) } else { fmt.Printf("You're not allowed in here! Get OUT!!") } } func aliceOrBob(text string) bool { if text == "Alice" { return true } else if text == "Bob" { return true } else { return false } }
當這個程式運行時,它會提示使用者輸入他們的名字,但即使使用者輸入“Alice”或“Bob”,程式也會錯誤地印出「You're not allowed in this!」滾出去! ! 」。
問題在於ReadString 方法會讀取輸入行,直到遇到指定的分隔符號。但是,在其預設行為中,它不會從返回的字串中刪除分隔符號。這意味著當使用者輸入“Alice”時,文字的值實際上是“Alicen”,它與aliceOrBob 函數中的任何名稱都不匹配。 aliceOrBob 函數中檢查文字之前從文字中刪除換行符:
或者,可以使用ReadLine 方法而不是ReadString 從os.Stdin 讀取一行輸入。不帶換行符。需要一個字串,因此需要使用字串函數將位元組切片轉換為字串:import ( .... "strings" .... ) ... if aliceOrBob(strings.TrimSpace(text)) { ...
以上是為什麼我的 Go `reader.ReadString` 函數無法正確處理使用者輸入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!