标准库fmt
是我们最常用到的格式化输入,输出工具。
fmt.Println
,接收任意参数,打印到命令行并进行换行:
package main
import "fmt"
func main() {
fmt.Println(1, 2, "a", "b", "c")
}
输出
打印结构体有自己默认的序列化为字符串的方法:
package main
import "fmt"
type person struct {
name string
age int
}
func main() {
p := person{name: "lang", age: 11}
fmt.Println(p)
}
输出
你也可以自定义输出的内容,只要结构体实现了String() string
方法,fmt
包就优先调用该方法。
package main
import "fmt"
type person struct {
name string
age int
}
func (p person) String() string {
return fmt.Sprintf("person{name = %s, age = %d}", p.name, p.age) // Sprintf 返回格式化后的字符串
}
func main() {
p := person{name: "lang", age: 11}
fmt.Println(p)
}
输出
person{name = lang, age = 11}
使用fmt.Printf
和动词占位符进行更精细化的格式化操作。
package main
import "fmt"
func main() {
name := "lang"
fmt.Printf("name: %s\n", name) // /n是换行符
}
输出
- 打印整数类型,使用
%d
动词, d
是 decimal 的缩写,表示十进制整数
package main
import "fmt"
func main() {
age := 110
fmt.Printf("age: %d\n", age)
}
输出
package main
import "fmt"
func main() {
money := 2.1252
fmt.Printf("money: %f\n", money) //标准输出
fmt.Printf("money: %.2f\n", money) // 保留两位小数,四舍五入
}
输出
money: 2.125200
money: 2.13
package main
import "fmt"
func main() {
isTrue := true
fmt.Printf("isTrue: %t\n", isTrue)
}
输出
package main
import "fmt"
func main() {
isTrue := true
var ptr *bool = &isTrue
fmt.Printf("pointer: %p\n", ptr)
}
输出
- 任意类型,使用
%v
动词,go会选择适合的格式化方式
package main
import "fmt"
type person struct {
name string
age int
}
func main() {
p := person{name: "lang", age: 11}
fmt.Printf("p: %v\n", p) // %v 默认格式
fmt.Printf("p: %+v\n", p) // %+v 包含字段名
fmt.Printf("p: %#v\n", p) // %#v 打印p的源代码格式
}
输出
p: {lang 11}
p: {name:lang age:11}
p: main.person{name:"lang", age:11}
- 通用格式化动词,输出默认格式
动词 | 描述 |
---|
%v | 按值的默认格式输出。 |
%+v | 类似 %v ,但结构体会包含字段名。 |
%#v | 值的 Go 语法表示形式(即源代码格式)。 |
%T | 打印值的类型。 |
%% | 字面百分号。 |
- 布尔类型
- 整数类型
动词 | 描述 |
---|
%b | 二进制表示。 |
%c | 相应 Unicode 码点的字符。 |
%d | 十进制表示。 |
%o | 八进制表示。 |
%x | 十六进制(小写字母)。 |
%X | 十六进制(大写字母)。 |
%U | Unicode 格式,例如 U+1234 。 |
- 浮点数和复数
动词 | 描述 |
---|
%e | 科学计数法(小写)。 |
%E | 科学计数法(大写)。 |
%f | 标准浮点数表示。 |
%.nf | 指定精度,n 为小数位数。 |
%g | 根据数值选择使用 %e 或 %f 。 |
%G | 根据数值选择使用 %E 或 %f 。 |
- 字符串和字节切片
动词 | 描述 |
---|
%s | 字符串或字节切片的内容(原样输出)。 |
%q | 双引号括起来的字符串(转义特殊字符)。 |
%x | 每字节以两字符的十六进制表示(小写字母)。 |
%X | 每字节以两字符的十六进制表示(大写字母)。 |
- 指针
与Printf
, Println
相同,不同的是将字符串返回,而不是打印到命令行:
package main
import "fmt"
func main() {
name := "lang"
str1 := fmt.Sprintln(name) // 返回字符串
str2 := fmt.Sprintf("name: %s\n", name) // 返回字符串
fmt.Print(str1)
fmt.Print(str2)
}
输出
与Printf
, Println
相同,不同的是将结果写入io.Writer
,而不是打印到命令行(os.Stdout
)
package main
import (
"fmt"
"os"
)
func main() {
name := "lang"
// os.Stdout 实现了`io.Writer` 接口
fmt.Fprintln(os.Stdout, name) // 指定输出到标准输出,命令行
fmt.Fprintf(os.Stdout, "name: %s\n", name) // 知道输出到标准输出,命令行
}
输出
你也可以指定其他io.Wrtier
接口的实现,例如输出到文件(*os.File
), http响应(http.ResponseWriter
)等。