lang

LangBook

13.fmt包

标准库fmt是我们最常用到的格式化输入,输出工具。

1. Println函数

fmt.Println,接收任意参数,打印到命令行并进行换行:

main.go
package main
 
import "fmt"
 
func main() {
	fmt.Println(1, 2, "a", "b", "c")
}

输出

1 2 a b c

打印结构体有自己默认的序列化为字符串的方法:

main.go
package main
 
import "fmt"
 
type person struct {
	name string
	age  int
}
 
func main() {
	p := person{name: "lang", age: 11}
	fmt.Println(p)
}

输出

{lang 11}

你也可以自定义输出的内容,只要结构体实现了String() string方法,fmt包就优先调用该方法。

main.go
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}

2. Printf函数

使用fmt.Printf和动词占位符进行更精细化的格式化操作。

  • 打印string类型, 使用%s动词
main.go
package main
 
import "fmt"
 
func main() {
	name := "lang"
	fmt.Printf("name: %s\n", name) // /n是换行符
}

输出

name: lang
  • 打印整数类型,使用%d动词, ddecimal 的缩写,表示十进制整数
main.go
package main
 
import "fmt"
 
func main() {
	age := 110
	fmt.Printf("age: %d\n", age) 
}

输出

age: 110
  • 浮点数类型,使用%f 动词
main.go
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
  • 布尔类型, 使用%t动词
main.go
package main
 
import "fmt"
 
func main() {
	isTrue := true
	fmt.Printf("isTrue: %t\n", isTrue) 
}

输出

isTrue: true
  • 指针类型,使用%p动词,打印指针地址
main.go
package main
 
import "fmt"
 
func main() {
	isTrue := true
	var ptr *bool = &isTrue 
	fmt.Printf("pointer: %p\n", ptr) 
}

输出

pointer: 0xc0000a200b
  • 任意类型,使用%v动词,go会选择适合的格式化方式
main.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}

3. 格式化动词一览表(记住上面的就好,下面的当资料查看)

  1. 通用格式化动词,输出默认格式
动词描述
%v按值的默认格式输出。
%+v类似 %v,但结构体会包含字段名。
%#v值的 Go 语法表示形式(即源代码格式)。
%T打印值的类型。
%%字面百分号。
  1. 布尔类型
动词描述
%t输出 truefalse
  1. 整数类型
动词描述
%b二进制表示。
%c相应 Unicode 码点的字符。
%d十进制表示。
%o八进制表示。
%x十六进制(小写字母)。
%X十六进制(大写字母)。
%UUnicode 格式,例如 U+1234
  1. 浮点数和复数
动词描述
%e科学计数法(小写)。
%E科学计数法(大写)。
%f标准浮点数表示。
%.nf指定精度,n 为小数位数。
%g根据数值选择使用 %e%f
%G根据数值选择使用 %E%f
  1. 字符串和字节切片
动词描述
%s字符串或字节切片的内容(原样输出)。
%q双引号括起来的字符串(转义特殊字符)。
%x每字节以两字符的十六进制表示(小写字母)。
%X每字节以两字符的十六进制表示(大写字母)。
  1. 指针
动词描述
%p十六进制表示的指针值(内存地址)

4. Sprintf,Sprintln函数

Printf, Println相同,不同的是将字符串返回,而不是打印到命令行:

main.go
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)
}

输出

lang
name: lang

5. Fprintf, Fprintln函数

Printf, Println相同,不同的是将结果写入io.Writer,而不是打印到命令行(os.Stdout)

main.go
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) // 知道输出到标准输出,命令行
}

输出

lang
name: lang

你也可以指定其他io.Wrtier接口的实现,例如输出到文件(*os.File), http响应(http.ResponseWriter)等。

On this page