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: }