使用 fmt.Scan() 时的注意事项

48 阅读1分钟

使用 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下:

  1. 在终端中输入:abc回车
  2. 此时缓冲区内容:abc\r\n
  3. 使用fmt.Scan()读取后,缓冲区中会剩下\n,因为\r被移出了。

在Linux下:

  1. 在终端中输入:abc回车
  2. 此时缓冲区内容:abc\n
  3. 使用fmt.Scan()读取后,缓冲区为空,因为\n被移出了。