我正在尝试学习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
答案在以下文档中Scanln:
Scanln
Scanln与Scan相似,但是在换行符处停止扫描,并且在最后一个项目之后必须有换行符或EOF。
Scan表现也与文档中的一样:
Scan
扫描扫描从标准输入读取的文本,并将连续的以空格分隔的值存储到连续的参数中。换行符算作空格。它返回成功扫描的项目数。如果该数目少于参数数目,则err将报告原因。
结论:Scan将每个单词(由空格分隔的字符串)放入相应的参数,将换行符视为空格。Scanln这样做也一样,但是将换行符视为停止符,此后不再解析。
如果您想读一行(\n最后),请使用bufio.Reader及其ReadString方法:
\n
bufio.Reader
ReadString
line, err := buffer.ReadString('\n')