从stdin读取行直到某个字符

ast*_*nic 9 go

我正在学习Go.

我的程序应该从stdin读取数据,直到我输入一个句点的行.

package main

import (

  "os"
  "fmt"
  "bufio"

)

func main(){

  in    := bufio.NewReader(os.Stdin)
  input := ""

  for input != "." {
    input, err := in.ReadString('\n')
    if err != nil {
      panic(err)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我应该如何修改for循环,以便在输入单个点时停止程序?

我尝试使用for语句实现while循环,我的方法有问题,条件是错误的,还是ReadString搞乱了我的数据?

sja*_*obi 14

以防万一其他人遇到这个问题:

从Go 1.1开始,有一种更好的方法可以循环一些可用的输入.这就是我今天解决OP问题的方法:

package main

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

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        line := scanner.Text()
        if line == "." {
            break
        }
        fmt.Println(line) // or do something else with line
    }
}
Run Code Online (Sandbox Code Playgroud)

scanner.Text() 自动剥离尾随换行符.


Ste*_*erg 11

...是ReadString弄乱我的数据?

不,不是.它正在读到下一个'\n'.这意味着只有一个点的行将具有数据".\n"".\r\n"取决于操作系统.

要删除行结尾,我会这样做 input = strings.TrimRight(input, "\r\n")