Go语言学习笔记(十六)之格式化输入输出

23.1格式化输入

1.从终端(一般来说是键盘)获取用户的输入

  1: fmt.Scanf 格式化的输入,空格作为分隔符
  2: fmt.Scan 从终端获取输入,存储在Scanln中的参数里,空格和换行符作为分隔符
  3: fmt.Scanln 同上,空格作为分隔符,遇到换行符结束

示例:
主要区分键盘输入过程中中途回车键和代码中\n的问题

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: func testScanf() {
  6: 	var a int
  7: 	var b string
  8: 	var c float32
  9: 	_, err := fmt.Scanf("%d %s %f", &a, &b, &c)
 10: 	if err != nil {
 11: 		fmt.Println("err=", err)
 12: 	}
 13: 	fmt.Printf("a=%d b=%s c=%f\n", a, b, c)
 14: }
 15: 
 16: func testScan() {
 17: 	var a int
 18: 	var b string
 19: 	var c float32
 20: 	_, err := fmt.Scan(&a, &b, &c)
 21: 	if err != nil {
 22: 		fmt.Println("err=", err)
 23: 	}
 24: 	fmt.Printf("a=%d b=%s c=%f\n", a, b, c)
 25: }
 26: 
 27: func testScanln()  {
 28: 	var a int
 29: 	var b string
 30: 	var c float32
 31: 	_, err := fmt.Scanln(&a, &b, &c)
 32: 	if err != nil {
 33: 		fmt.Println("err=", err)
 34: 	}
 35: 	fmt.Printf("a=%d b=%s c=%f\n", a, b, c)
 36: }
 37: 
 38: func main(){
 39: 	testScanf()
 40: 	testScan()
 41: 	testScanln()
 42: }

2.从字符串中获取输入,与终端输入类似

  1: fmt.Sscanf()
  2: fmt.Sscan()
  3: fmt.Sscanln()

代码示例:

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: func testSscanf()  {
  6: 	var a int
  7: 	var b string
  8: 	var c float32
  9: 	str := "88 hello 8.8"
 10: 	_, err := fmt.Sscanf(str, "%d %s %f", &a, &b, &c)
 11: 	if err != nil {
 12: 		fmt.Println("err=", err)
 13: 	}
 14: 	fmt.Printf("a=%d, b=%s, c=%f\n", a, b, c)
 15: }
 16: 
 17: func testSscan()  {
 18: 	var a int
 19: 	var b string
 20: 	var c float32
 21: 	str := "88 \nhello \n\n8.8"
 22: 	_, err := fmt.Sscan(str, &a, &b, &c)
 23: 	if err != nil {
 24: 		fmt.Println("err=", err)
 25: 	}
 26: 	fmt.Printf("a=%d, b=%s, c=%f\n", a, b, c)
 27: }
 28: 
 29: func testSscanln()  {
 30: 	var a int
 31: 	var b string
 32: 	var c float32
 33: 	str := "88 \nhello \n8.8"
 34: 	_, err := fmt.Sscanln(str, &a, &b, &c)
 35: 	if err != nil {
 36: 		fmt.Println("err=", err)
 37: 	}
 38: 	fmt.Printf("a=%d, b=%s, c=%f\n", a, b, c)
 39: }
 40: 
 41: 
 42: func main()  {
 43: 	testSscanf()
 44: 	testSscan()
 45: 	testSscanln()
 46: }
 47: 
  1: >>> a=88, b=hello, c=8.800000
  2: a=88, b=hello, c=8.800000
  3: err= unexpected newline
  4: a=88, b=, c=0.000000

3.从文件中获取格式化输入

代码示例

  1: func main()  {
  2: 	var a int
  3: 	var b string
  4: 	var c float32
  5: 	_, err1 := fmt.Fscanf(os.Stdin, "%d%s%f", &a, &b, &c)
  6: 	if err1 != nil {
  7: 		fmt.Println("err1=", err1)
  8: 	}
  9: 	fmt.Println(a, b, c)
 10: 	_, err2 := fmt.Fscan(os.Stdin, &a, &b, &c)
 11: 	// 每输入一个回车一下发现可以继续回车
 12: 	if err2 != nil {
 13: 		fmt.Println("err2=", err2)
 14: 	}
 15: 	fmt.Println(a, b, c)
 18: 		fmt.Println("err3=", err3)
 16: 	_, err3 := fmt.Fscanln(os.Stdin, &a, &b, &c)
 17: 	if err3 != nil {
 19: 	}
 20: 	fmt.Println(a, b, c)
 21: }

23.2格式化输出

打印在终端上

  1: fmt.Printf()  format string
  2: fmt.Println() 自带换行
  3: fmt.Print() 不会换行

格式化输出字符串(返回字符串)

  1: fmt.Sprintf()  format string
  2: fmt.Sprintln() 按空格进行格式化并换行
  3: fmt.Sprint() 不会换行

格式化输出到文件中

  1: fmt.Fprintf() format string 写入到文件
  2: fmt.Fprintln() 把单个或多个文件写入到文件中,并换行
  3: fmt.Fprint() 不换行

示例

  1: func main() {
  2: 	var a int
  3: 	var b string
  4: 	var c float32
  5: 	fmt.Fscanf(os.Stdin, "%d%s%f", &a, &b, &c)
  6: 	fmt.Fprintln(os.Stdout, "stdout:", a, b, c)
  7: }

终端输入输出背后的原理

终端其实是一个文件

  1: os.Stdin 标准输入的文件示例,*File
  2: os.Stdout 标准输出的文件示例,*File
  3: os.Stderr 标准错误输出的文件实例 *File

终端读取

  1: File.Read(b []byte)
  2: // os.Stdin.Read()

终端输出

  1: File.Write()
  2: File.WriteString(str string)

带缓冲区的读写

相对内存读写来说,文件(磁盘)的性能其实比较差,go语言中使用bufio包来实现带缓冲的读写。

代码示例

  1: var inputReader *bufio.Reader
  2: func main() {
  3: 	var input string
  4: 	var err error
  5: 	inputReader = bufio.NewReader(os.Stdin)
  6: 	fmt.Println("Please input:")
  7: 	// 
  8: 	input, err = inputReader.ReadString('\n')
  9: 	if err == nil {
 10: 		fmt.Printf("input:%s\n", input)
 11: 	} else {
 12: 		fmt.Println("err=", err)
 13: 	}
 14: }

猜你喜欢

转载自www.cnblogs.com/haoqirui/p/10213248.html