使用 fmt.Scan() 时的注意事项
在使用fmt.Scan()从终端中读取到一个值时,不仅会将这个值前的特殊字符移除,还会顺便将这个值后的一个特殊字符[回车\r | 换行\n | 空格\s],给移出缓冲区。
示例代码:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
var a string
fmt.Scan(&a)
reader := bufio.NewReader(os.Stdin)
for {
read(reader)
}
}
func read(reader *bufio.Reader) {
var b byte
b, _ = reader.ReadByte()
fmt.Println(int(b))
}
在Windows下:
- 在终端中输入:
abc和回车。 - 此时缓冲区内容:
abc\r\n。 - 使用
fmt.Scan()读取后,缓冲区中会剩下\n,因为\r被移出了。
在Linux下:
- 在终端中输入:
abc和回车。 - 此时缓冲区内容:
abc\n。 - 使用
fmt.Scan()读取后,缓冲区为空,因为\n被移出了。