跳到主要内容

Go fmt 与模板速记

1. 常用函数族

类别函数作用
控制台输出Print Println Printf输出到标准输出
返回字符串Sprint Sprintln Sprintf返回格式化后的字符串
写入 io.WriterFprint Fprintln Fprintf写文件、HTTP 响应等
错误包装Errorf返回格式化后的 error
  • Println 会自动加空格和换行
  • Printf / Sprintf / Fprintf 才支持格式化占位符

2. 高频 verbs

通用 / 调试

Verb含义备注
%v默认格式最常用
%+vstruct 带字段名调试结构体很有用
%#vGo 语法表示最完整的调试输出
%T类型看变量类型
%%字面 %输出百分号

字符串 / 字节

Verb含义
%s字符串或 []byte
%q带引号字符串
%x十六进制小写
%X十六进制大写

整数

Verb含义
%d十进制
%b二进制
%o八进制
%x / %X十六进制
%cUnicode 字符
%UUnicode 码点

浮点数

Verb含义
%f小数形式
%.2f保留两位小数
%e / %E科学计数法
%g / %G更紧凑的输出

其他

Verb含义
%t布尔值
%p指针地址

3. 宽度、对齐、补零

格式含义例子
%5d宽度 5,右对齐" 42"
%-5d宽度 5,左对齐"42 "
%05d宽度 5,左侧补 0"00042"
%.2f两位小数"3.14"
%6.2f总宽度 6,两位小数" 3.14"

4. Errorf%w

如果只是拼一个错误字符串:

return fmt.Errorf("read file failed: %v", err) // 仅拼接信息,unwrap 不一定保留

如果是要包装底层错误,保留后续 errors.Is / errors.As 能力,就用 %w

return fmt.Errorf("读取配置失败: %w", err)

注意:

  • %w 是给 fmt.Errorf 用的
  • 它的语义不是普通格式化,而是 error wrapping

5. 高频示例

type User struct {
Name string
Age int
}

u := User{Name: "Jack", Age: 18}

fmt.Printf("%%v : %v\n", u)
fmt.Printf("%%+v : %+v\n", u)
fmt.Printf("%%#v : %#v\n", u)
fmt.Printf("%%T : %T\n", u)

msg := fmt.Sprintf("用户 %s 的年龄是 %03d", u.Name, u.Age)
fmt.Println(msg)

progress := 0.87654
fmt.Printf("当前进度: %.2f%%\n", progress*100)

6. 和 text/template 的边界(极简)

fmt格式化成字符串;text/template / html/template数据结构填充模板再写到 io.Writer

import (
"os"
"text/template"
)

type User struct {
Name string
Age int
}

tmpl := template.Must(template.New("u").Parse(`你好,{{.Name}}({{.Age}})
{{range .Items}}- {{.}}
{{end}}`))

// html/template 会对 HTML 做转义,防 XSS;生成 HTML 优先用它
_ = tmpl.Execute(os.Stdout, map[string]any{
"Name": "AsMuin",
"Age": 18,
"Items": []string{"a", "b"},
})

常用动作:{{.Field}}{{if}}{{range}}{{with}}{{define}}/{{template}}
需要格式化某个字段时,可以在数据里先 fmt.Sprintf,或注册 FuncMap

总结

  • 调试优先:%v / %+v / %#v / %T
  • 字符串最常用:%s / %q
  • 整数最常用:%d
  • 小数最常用:%.2f
  • 补零最常用:%02d / %03d
  • 错误包装用:fmt.Errorf("...: %w", err)
  • 结构化渲染用 text/template;HTML 用 html/template

一句话总结:

fmt 负责值到字符串;模板负责数据结构到 Writer。 fmt 日常核心组合仍是 %v%+v%#v%d%s%.2f%w