首页 >后端开发 >Golang >为什么 Go 的 `bufio.Reader.ReadString` 保留前导分隔符,以及如何避免此问题?

为什么 Go 的 `bufio.Reader.ReadString` 保留前导分隔符,以及如何避免此问题?

Susan Sarandon
Susan Sarandon原创
2024-12-18 05:10:11283浏览

Why Does Go's `bufio.Reader.ReadString` Preserve Leading Delimiters, and How Can I Avoid This Issue?

Reader.ReadString 可以保留前导分隔符

在 Go 中,bufio.Reader.ReadString 的行为在解析输入时可能有所不同。考虑以下场景:

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Who are you? Enter your name: ")
    text, _ := reader.ReadString('\n')
    if text == "Alice" || text == "Bob" {
        fmt.Printf("Hello, ", text)
    } else {
        fmt.Printf("You're not allowed in here!")
    }
}

这里,ReadString 用于读取用户输入,并期望名称以换行符结尾。但是,当输入的名称与“Alice”或“Bob”匹配时,程序会错误地拒绝访问。

原因和解决方案

出现此问题的原因是 ReadString 保留了前导事件分隔符(在本例中为“n”)。当输入像“Alice”这样的名称时,存储在文本中的字符串包括“Alice”和尾随换行符。这个额外的换行符会阻止字符串比较与预期值匹配。

要解决此问题,请考虑以下方法:

  1. 修剪前导空格:之前将文本与“Alice”或“Bob”进行比较,使用 strings.TrimSpace(text) 删除任何前导空格,包括换行符
  2. 使用 ReadLine 代替: 或者,切换到 reader.ReadLine() 而不是 ReadString。此函数返回不包含任何前导或尾随分隔符的输入。请注意 reader.ReadLine() 将返回字节;因此,使用 string(bytes).
将其转换为字符串

以上是为什么 Go 的 `bufio.Reader.ReadString` 保留前导分隔符,以及如何避免此问题?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn