(实践)Go 语言入门指南:基础语法和常用特性解析(三) | 青训营

75 阅读4分钟

Go语言的Go fmt库以及输入和输出

Go语言的fmt包是一个提供格式化输入和输出的标准库。它包含了一组函数和方法,用于处理各种数据类型并根据需要进行格式化、打印和扫描。

fmt包的主要功能如下:

  1. 格式化打印输出:
  • Print系列函数:PrintPrintfPrintln用于将数据打印到标准输出(控制台)。
  • Sprint系列函数:SprintSprintfSprintln用于将数据格式化为字符串。
  • Fprint系列函数:FprintFprintfFprintln用于将数据打印到指定的输出流(文件、网络连接等)。

在Go的fmt包中,常用的格式化打印占位符如下:

  • %v:通用占位符,根据值的默认格式输出。
  • %+v:类似%v,但输出结构体时会包含字段名。
  • %#v:输出值的Go语法表示。
  • %T:输出值的类型。
  • %%:输出百分号。

针对不同的数据类型,还有一些特定的占位符:

  • %b:将整数以二进制形式输出。
  • %d:将整数以十进制形式输出。
  • %o:将整数以八进制形式输出。
  • %x:将整数以十六进制形式输出,使用小写字母a-f。
  • %X:将整数以十六进制形式输出,使用大写字母A-F。
  • %f:将浮点数以标准计数法输出。
  • %e:将浮点数以科学计数法输出,使用小写字母e。
  • %E:将浮点数以科学计数法输出,使用大写字母E。
  • %g:根据实际情况自动选择%f%e格式输出浮点数。
  • %s:输出字符串。
  • %q:输出带有双引号的字符串。
  • %p:输出指针的十六进制表示。

示例:

package main

import "fmt"

func main() {
	num := 42
	str := "Hello, world!"
	flt := 3.14
	ptr := &num

	fmt.Printf("%v\n", num)    // 42
	fmt.Printf("%+v\n", num)   // 42
	fmt.Printf("%#v\n", num)   // 42
	fmt.Printf("%T\n", num)    // int
	fmt.Printf("%%\n")         // %
	fmt.Printf("%b\n", num)    // 101010
	fmt.Printf("%d\n", num)    // 42
	fmt.Printf("%o\n", num)    // 52
	fmt.Printf("%x\n", num)    // 2a
	fmt.Printf("%X\n", num)    // 2A
	fmt.Printf("%f\n", flt)    // 3.140000
	fmt.Printf("%e\n", flt)    // 3.140000e+00
	fmt.Printf("%E\n", flt)    // 3.140000E+00
	fmt.Printf("%g\n", flt)    // 3.14
	fmt.Printf("%s\n", str)    // Hello, world!
	fmt.Printf("%q\n", str)    // "Hello, world!"
	fmt.Printf("%p\n", ptr)    // 0xc000014078
}
  1. 扫描输入:
  • Scan系列函数:ScanScanfScanln用于从标准输入中读取数据并存入指定的变量中。
  • Sscan系列函数:SscanSscanfSscanln用于从字符串中读取数据并存入指定的变量中。
  • Fscan系列函数:FscanFscanfFscanln用于从指定的输入流中读取数据并存入指定的变量中。

这些函数也使用类似C语言的格式化占位符进行数据的解析和赋值。

示例:

package main

import "fmt"

func main() {
	var name string
	var age int

	fmt.Print("Enter your name: ")
	fmt.Scan(&name)

	fmt.Print("Enter your age: ")
	fmt.Scanln(&age)

	fmt.Printf("Name: %s, Age: %d\n", name, age)
}
  1. bufio包的读取:

除了fmt包外,Go语言还提供了bufio包,它提供了带缓冲的输入输出功能。bufio包中的Scanner类型可以方便地读取文本文件的内容,并支持自定义的分隔符、缓冲区大小等配置。

示例:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("data.txt")
	if err != nil {
		fmt.Println("Failed to open file:", err)
		return
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		fmt.Println(line)
	}

	if err := scanner.Err(); err != nil {
		fmt.Println("Scanner error:", err)
	}
}

有关更详细的信息和使用示例,可以参考官方文档(golang.org/pkg/fmt/golang.org/pkg/bufio/)…

个人感悟

Go语言的fmt包简洁易用,提供了一组简洁而易用的函数和占位符,使得输入输出操作变得更加方便;还提供了丰富多样的占位符,适用于不同的数据类型和格式化需求。除了格式化打印输出外,fmt包还提供了一系列函数用于从标准输入或其他输入流中读取数据。这让我们能够方便地获取用户的输入,并将其存储到指定的变量中。在实际开发中,这对于构建命令行界面和处理用户交互非常有帮助。此外,在使用fmt包进行输入操作时,我们需要注意错误处理。例如,使用Scan系列函数读取输入时,可以通过检查返回的错误来判断输入是否成功。这可以帮助我们避免潜在的错误和异常情况。

希望我的感悟能够对大家有所帮助!