Go语言的fmt
包用于格式化输入和输出,类似C语言的printf
和scanf
。它是Go标准库中的常用包之一,通常用于在控制台程序中输入和输出内容。这篇笔记我们简单介绍一下fmt
包的使用。
fmt.Println()
函数用于输出一行文本,该函数会自动在输出的末尾附加换行符。
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, world!")
}
除此之外,fmt.Print()
也能输出一行文本,但不会附加换行符。
fmt.Printf()
用于格式化输出,我们可以使用占位符来组装输出格式。
package main
import (
"fmt"
)
func main() {
value := 3
fmt.Printf("Value is %v\n", value)
}
常用的占位符包括:
%d
:十进制整数%b
:二进制整数%o
:八进制整数%x
:十六进制整数,使用a-f%X
:十六进制整数,使用A-F%c
:Unicode码点对应的字符%U
:Unicode格式,形如U+1234
%f
:浮点数,也可以使用类似%.2f
的形式指定小数点后的保留位数%e
:科学计数法,例如-1234.456e+78
%E
:科学计数法,但使用大写E
,例如-1234.456E+78
%t
:布尔值,true
或false
%s
:字符串%p
:指针,使用十六进制表示%v
:值的默认格式,支持多种类型,如果是结构体类型则内部字段值也会显示出来%+v
:类似%v
,但结构体字段名会显示出来%T
:值类型如果不确定该用什么占位符,用%v
就行了。
fmt.Scanln()
函数可以读取若干个参数到变量,多个变量使用空格分隔,使用换行结束输入,返回值n
是读入的变量个数。
package main
import (
"fmt"
)
func main() {
var str0 string
var str1 string
n, err := fmt.Scanln(&str0, &str1)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Input: %v %v Number of items scanned: %v\n", str0, str1, n)
}
类似格式化输出,fmt.Scanf()
能够实现格式化输入,我们需要使用占位符来匹配输入的值。
package main
import (
"fmt"
)
func main() {
var str0 string
var str1 string
n, err := fmt.Scanf("Input %v %v", &str0, &str1)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Input: %v %v Number of items scanned: %v\n", str0, str1, n)
}
上面代码中,如果我们输入Input 1 2
,程序将能成功读入两个变量。
实际开发中,我们可能需要向控制台输出一些日志信息,有时图方便就会使用fmt
来实现,但实际上这不是一种最佳实践。
fmt
包仅用于格式化输入输出,它并不是为日志记录而设计的,日志功能还包含日志级别、输出格式(文本日志还是结构化日志)、输出形式(文件还是控制台)等一系列功能,这些功能都是fmt
不具备的。Go语言标准库有log
和slog
这两个包来专门输出日志,此外也有zap
、logrus
等第三方日志包,我们应该使用这些包来实现日志功能,而不是使用fmt
。