模块课程(5/5)
带 fmt 的输入/输出
标准库的 fmt 包是打印到的主要工具
控制台,格式化字符串和读取输入。如果您使用过
C 中的 printf 您会感到宾至如归,但需要一些额外的改进
感谢 %v 和 %T 动词。
Print、Println、Printf:三个函数,三种行为
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 |
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) // float64Sprintf:构建字符串而不打印它们
与 Printf 相同的接口,但结果以
string:
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 您可以包装现有错误以保留其
链(我们将在接口模块中深入介绍这一点):
if _, err := os.Open("missing"); err != nil {
return fmt.Errorf("apertura config: %w", err)
}轮到你了
使用 fmt.Println 打印字符串“ciao mondo”。
显示提示
`fmt.Println` 接受一个字符串并添加换行符本身。
3 次尝试后可用的解决方案
使用 fmt.Printf 打印“eta=36”,后跟换行符,并使用 %d 动词表示整数。
显示提示
`Printf` 不会添加换行符:您必须在格式字符串中包含 `\\n`。
3 次尝试后可用的解决方案
哪个动词打印值的动态类型?
fmt.Printf("?\n", 3.14)回顾
Print/Println/Printf在空格和换行符方面有所不同。%v是适用于任何类型的通配符;%+v显示字段名称。%T打印类型(对于快速调试很有用)。Sprintf构建字符串;Errorf使用包装 (%w) 构建错误。Printf不添加换行符:自己将其写入格式字符串中。