Skip to content

fmt

fmt 是 Go 语言的标准库之一,主要用于格式化和输出文本。它提供了多个函数,允许你以指定格式打印、扫描和处理字符串、数字、布尔值、错误等类型的数据。fmt 包常用于格式化输出和处理输入,类似于 C 语言中的 printfscanf

导入

go
package main

import (
	"encoding/json"
)

1. fmt 包常用函数

1.1 格式化输出:fmt.Printf, fmt.Println, fmt.Print

  • fmt.Print():输出指定的内容,但不自动换行。

    go
    fmt.Print("Hello")
    fmt.Print(" World")

    输出

    Hello World
  • fmt.Println():输出指定的内容,并在末尾自动添加换行符。

    go
    fmt.Println("Hello")
    fmt.Println("World")

    输出

    Hello
    World
  • fmt.Printf():按指定格式输出内容。

    go
    fmt.Printf("Name: %s, Age: %d\n", "John", 30)

    输出

    Name: John, Age: 30

1.2 格式化打印占位符

fmt.Printf 使用占位符来指定输出的格式,常见的占位符包括:

占位符描述
%s字符串
%d十进制整数
%f浮动小数
%v默认格式(适用于大多数类型)
%T类型的 Go 语言表示形式
%x十六进制表示整数
%b二进制表示整数
%p指针地址
%t布尔值(true 或 false)
%c输出字符(对应的 Unicode 值)

示例:

go
package main

import "fmt"

func main() {
    name := "Alice"
    age := 25
    height := 5.9
    isStudent := true

    // 使用不同的占位符格式化输出
    fmt.Printf("Name: %s\n", name)
    fmt.Printf("Age: %d\n", age)
    fmt.Printf("Height: %.2f\n", height)
    fmt.Printf("Is Student: %t\n", isStudent)
    fmt.Printf("Type of name: %T\n", name)
    fmt.Printf("Hexadecimal of age: %x\n", age)
}

输出

Name: Alice
Age: 25
Height: 5.90
Is Student: true
Type of name: string
Hexadecimal of age: 19

1.3 高级格式化功能

  • 宽度和精度:可以通过格式化占位符指定输出宽度和精度。

    go
    fmt.Printf("|%-10s|%-10s|\n", "Name", "Age")
    fmt.Printf("|%10s|%10d|\n", "Alice", 25)

    输出

    |Name      |Age       |
    |     Alice|        25|
  • 浮动数的精度:可以指定浮动数的精度(小数点后的位数)。

    go
    fmt.Printf("Height: %.2f\n", 5.9876)

    输出

    Height: 5.99
  • 填充符:指定输出的填充字符(默认是空格)。

    go
    fmt.Printf("|%*s|\n", 10, "Hi")
    fmt.Printf("|%-*s|\n", 10, "Hi")

    输出

    |        Hi|
    |Hi        |

1.4 格式化打印结构体和数组

  • 对于结构体,使用 %+v 可以输出字段名称。

    go
    type Person struct {
        Name string
        Age  int
    }
    
    p := Person{"John", 30}
    fmt.Printf("%+v\n", p)

    输出

    {Name:John Age:30}
  • 对于数组或切片,使用 %v%#v(包含类型信息)进行输出。

    go
    arr := []int{1, 2, 3}
    fmt.Printf("%v\n", arr)
    fmt.Printf("%#v\n", arr)

    输出

    [1 2 3]
    []int{1, 2, 3}

2. 输入函数:fmt.Scan, fmt.Scanf, fmt.Scanln

Go 的 fmt 包也提供了从标准输入读取数据的功能,常见的输入函数包括:

  • fmt.Scan():读取输入的内容,按空格分隔输入数据,并存储到对应的变量中。

    go
    var name string
    var age int
    fmt.Scan(&name, &age)
    fmt.Printf("Name: %s, Age: %d\n", name, age)
  • fmt.Scanln():与 fmt.Scan() 类似,但它会在读取输入时遇到换行符时停止。

    go
    var name string
    fmt.Scanln(&name)
    fmt.Printf("Hello, %s!\n", name)
  • fmt.Scanf():通过格式化字符串读取输入内容。类似于 fmt.Printf,它会根据格式化字符串的规则解析输入。

    go
    var name string
    var age int
    fmt.Scanf("%s %d", &name, &age)
    fmt.Printf("Name: %s, Age: %d\n", name, age)

3. fmt 的常见使用场景

  • 打印调试信息:在开发过程中,可以使用 fmt.Printf 输出变量的值和类型,帮助调试。

    go
    fmt.Printf("Value: %v, Type: %T\n", someVariable, someVariable)
  • 格式化输出fmt.Printf 用于生成格式化的输出结果,适用于报告、日志和终端命令行程序。

    go
    fmt.Printf("Total: %.2f\n", totalAmount)
  • 控制输入fmt.Scanfmt.Scanf 可用于读取用户输入的内容,根据输入内容执行不同操作。

4. 注意事项

  • 错误处理fmt.Scan()fmt.Scanf() 函数会返回错误,因此在使用时应检查错误。

    go
    var name string
    _, err := fmt.Scan(&name)
    if err != nil {
        fmt.Println("Error:", err)
    }
  • 格式化输出时的类型匹配:确保在 fmt.Printf 等函数中使用的格式化符号与传入的变量类型匹配。例如,使用 %d 格式符输出整数,使用 %f 输出浮点数。

5. 小结

  • fmt 包提供了强大的格式化输出和输入功能,帮助开发者灵活地处理不同类型的数据。
  • 通过格式化占位符,你可以控制输出内容的格式,精确控制输出的宽度、对齐、精度等。
  • 输入相关函数(如 fmt.Scanfmt.Scanf)则帮助你处理来自用户的输入。

掌握 fmt 包的使用可以显著提高你在 Go 语言开发中的效率,尤其在输出调试信息、日志、用户交互等场景下十分有用。