跳转到主要内容
模块 1 · 第 5 课(共 5)课程中的5/50~10 min
模块课程(5/5)

带 fmt 的输入/输出

标准库的 fmt 包是打印到的主要工具 控制台,格式化字符串和读取输入。如果您使用过 C 中的 printf 您会感到宾至如归,但需要一些额外的改进 感谢 %v 和 %T 动词。

Print、Println、Printf:三个函数,三种行为

Go
fmt.Print("ciao ", "mondo")    // "ciao mondo"  (niente newline finale)
fmt.Println("ciao", "mondo")   // "ciao mondo\n" (newline + spazi tra argomenti)
fmt.Printf("eta=%d\n", 36)     // "eta=36\n"    (format string esplicita)

你会一直使用的动词

| 动词 | 打印什么 | 示例 | | ------ | ---------------------------------- | ------------------------------- | ---------- | | %v | “默认值” — 适用于任何类型 | {Ada 36} | {Ada 36} | | %+v | 类似于 %v 但在结构中具有字段名称 | {Name:Ada Age:36} | | %#v | 值的“Go-syntax”表示 | main.User{Name:"Ada", Age:36} | | %T | 值的类型 | float64 | | %d | 以 10 为底的整数 | 42 | | %f | %f浮动 | 3.140000 | | %.2f | 保留 2 位小数的浮点数 | 3.14 | 3.14 | | %s | 字符串 | Ada | Ada | | %q | “引用”字符串(带引号和转义符) | "Ada\n" | "Ada\n" | | %t | %t布尔 | true | true | | %x | %x十六进制(小写) | 2a | | %b | %b二进制 | 101010 |

Go
u := struct{ Name string; Age int }{"Ada", 36}
fmt.Printf("%v\n", u)   // {Ada 36}
fmt.Printf("%+v\n", u)  // {Name:Ada Age:36}
fmt.Printf("%T\n", 3.14) // float64

Sprintf:构建字符串而不打印它们

与 Printf 相同的接口,但结果以 string:

Go
msg := fmt.Sprintf("L'utente %s ha %d anni", "Ada", 36)
fmt.Println(msg) // L'utente Ada ha 36 anni

您将不断使用它来构建消息、日志和错误。

Errorf:字符串+错误包装

fmt.Errorf 创建具有 Printf 样式格式的 error 。随着 特殊动词 %w 您可以包装现有错误以保留其 链(我们将在接口模块中深入介绍这一点):

Go
if _, err := os.Open("missing"); err != nil {
    return fmt.Errorf("apertura config: %w", err)
}

轮到你了

锻炼#go.m1.l5.e1
尝试:0加载中...

使用 fmt.Println 打印字符串“ciao mondo”。

正在加载编辑器...
显示提示

`fmt.Println` 接受一个字符串并添加换行符本身。

3 次尝试后可用的解决方案

锻炼#go.m1.l5.e2
尝试:0加载中...

使用 fmt.Printf 打印“eta=36”,后跟换行符,并使用 %d 动词表示整数。

正在加载编辑器...
显示提示

`Printf` 不会添加换行符:您必须在格式字符串中包含 `\\n`。

3 次尝试后可用的解决方案

Quiz#go.m1.l5.e3
准备好

哪个动词打印值的动态类型?

Go
fmt.Printf("?\n", 3.14)
答案选项

回顾

  • Print/Println/Printf 在空格和换行符方面有所不同。
  • %v 是适用于任何类型的通配符; %+v 显示字段名称。
  • %T 打印类型(对于快速调试很有用)。
  • Sprintf 构建字符串; Errorf 使用包装 (%w) 构建错误。
  • Printf 不添加换行符:自己将其写入格式字符串中。