一尘不染

fmt.Scanln预期的换行错误

go

我正在尝试学习Go,但是坚持使用以下语言:http :
//ideone.com/hbCamr或http://ideone.com/OvRw7t

package main
import "fmt"

func main(){
  var i int
  var f float64
  var s string

  _, err := fmt.Scan(&i)
  if err == nil {
    fmt.Println("read 1 integer: ",i)
  } else {
    fmt.Println("Error: ",err)
  }

  _, err = fmt.Scan(&f)
  if err == nil {
    fmt.Println("read 1 float64: ",f)
  } else {
    fmt.Println("Error: ",err)
  }
  _, err = fmt.Scan(&s)
  if err == nil {
    fmt.Println("read 1 string: ",s)
  } else {
    fmt.Println("Error: ",err)
  }

  _, err = fmt.Scanln(&s)
  if err == nil {
    fmt.Println("read 1 line: ",s)
  } else {
    fmt.Println("Error: ",err)
  }
}

对于此输入:

123
123.456
everybody loves ice cream

输出为:

read 1 integer:  123
read 1 float64:  123.456
read 1 string:  everybody
Error:  Scan: expected newline

这是预期的行为吗?为什么它不像C ++
getline一样起作用?http://ideone.com/Wx8z5o


阅读 208

收藏
2020-07-02

共1个答案

一尘不染

答案在以下文档中Scanln

Scanln与Scan相似,但是在换行符处停止扫描,并且在最后一个项目之后必须有换行符或EOF。

Scan表现也与文档中的一样:

扫描扫描从标准输入读取的文本,并将连续的以空格分隔的值存储到连续的参数中。换行符算作空格。它返回成功扫描的项目数。如果该数目少于参数数目,则err将报告原因。

结论:Scan将每个单词(由空格分隔的字符串)放入相应的参数,将换行符视为空格。Scanln这样做也一样,但是将换行符视为停止符,此后不再解析。

如果您想读一行(\n最后),请使用bufio.Reader及其ReadString方法:

line, err := buffer.ReadString('\n')
2020-07-02