Go语言的Go fmt库以及输入和输出
Go语言的fmt包是一个提供格式化输入和输出的标准库。它包含了一组函数和方法,用于处理各种数据类型并根据需要进行格式化、打印和扫描。
fmt包的主要功能如下:
- 格式化打印输出:
Print系列函数:Print、Printf、Println用于将数据打印到标准输出(控制台)。Sprint系列函数:Sprint、Sprintf、Sprintln用于将数据格式化为字符串。Fprint系列函数:Fprint、Fprintf、Fprintln用于将数据打印到指定的输出流(文件、网络连接等)。
在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
}
- 扫描输入:
Scan系列函数:Scan、Scanf、Scanln用于从标准输入中读取数据并存入指定的变量中。Sscan系列函数:Sscan、Sscanf、Sscanln用于从字符串中读取数据并存入指定的变量中。Fscan系列函数:Fscan、Fscanf、Fscanln用于从指定的输入流中读取数据并存入指定的变量中。
这些函数也使用类似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)
}
- 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系列函数读取输入时,可以通过检查返回的错误来判断输入是否成功。这可以帮助我们避免潜在的错误和异常情况。
希望我的感悟能够对大家有所帮助!