格式化输出

通用:

  • %v 值的默认格式表示
  • %+v 类似%v,但输出结构体时会添加字段名
  • %#v 值的Go语法表示
  • %T 值的类型的Go语法表示
  • %% 百分号

    布尔值:

  • %t 单词true或false

    整数:

  • %b 表示为二进制

  • %c 该值对应的unicode码值
  • %d 表示为十进制,如%02d,表示如果d不足两位,会在前面补0
  • %o 表示为八进制
  • %q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
  • %x 表示为十六进制,使用a-f
  • %X 表示为十六进制,使用A-F
  • %U 表示为Unicode格式:U+1234,等价于”U+%04X”

    浮点数与复数的两个组分:

  • %b 无小数部分、二进制指数的科学计数法,如-123456p-78;参见strconv.FormatFloat

  • %e 科学计数法,如-1234.456e+78
  • %E 科学计数法,如-1234.456E+78
  • %f 有小数部分但无指数部分,如123.456。可指定小数位%.2f或指定整数与小数位%9.2f
  • %F 等价于%f
  • %g 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
  • %G 根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)

    字符串和[]byte:

  • %s 直接输出字符串或者[]byte

  • %q 该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
  • %x 每个字节用两字符十六进制数表示(使用a-f)
  • %X 每个字节用两字符十六进制数表示(使用A-F)

    指针:

  • %p 表示为十六进制,并加上前导的0x

type Stringer

实现了Stringer接口的类型

  1. type Stringer interface {
  2. String() string
  3. }

type GoStringer

实现了GoStringer接口的类型(即有GoString方法)

  1. type GoStringer interface {
  2. GoString() string
  3. }

type State

State代表一个传递给自定义Formatter接口的Format方法的打印环境。它实现了io.Writer接口用来写入格式化的文本,还提供了该操作数的格式字符串指定的选项和宽度、精度信息(通过调用方法)。

  1. type State interface {
  2. // Write方法用来写入格式化的文本
  3. Write(b []byte) (ret int, err error)
  4. // Width返回宽度值,及其是否被设置
  5. Width() (wid int, ok bool)
  6. // Precision返回精度值,及其是否被设置
  7. Precision() (prec int, ok bool)
  8. // Flag报告是否设置了flag c(一个字符,如+、-、#等)
  9. Flag(c int) bool
  10. }

type Formatter

实现了Formatter接口的类型可以定制自己的格式化输出。Format方法的实现内部可以调用Sprint或Fprint等函数来生成自身的输出。

  1. type Formatter interface {
  2. // c为verb,f提供verb的细节信息和Write方法用于写入生成的格式化文本
  3. Format(f State, c rune)
  4. }

type ScanState

ScanState代表一个将传递给Scanner接口的Scan方法的扫描环境。 Scan函数中,可以进行一次一个rune的扫描,或者使用Token方法获得下一个token(比如空白分隔的token)。

  1. type ScanState interface {
  2. // 从输入读取下一个rune(Unicode码值),在读取超过指定宽度时会返回EOF
  3. // 如果在Scanln、Fscanln或Sscanln中被调用,本方法会在返回第一个'\n'后再次调用时返回EOF
  4. ReadRune() (r rune, size int, err error)
  5. // UnreadRune方法让下一次调用ReadRune时返回上一次返回的rune且不移动读取位置
  6. UnreadRune() error
  7. // SkipSpace方法跳过输入中的空白,换行被视为空白
  8. // 在Scanln、Fscanln或Sscanln中被调用时,换行被视为EOF
  9. SkipSpace()
  10. // 方法从输入中依次读取rune并用f测试,直到f返回假;将读取的rune组织为一个[]byte切片返回。
  11. // 如果skipSpace参数为真,本方法会先跳过输入中的空白。
  12. // 如果f为nil,会使用!unicode.IsSpace(c);就是说返回值token将为一串非空字符。
  13. // 换行被视为空白,在Scanln、Fscanln或Sscanln中被调用时,换行被视为EOF。
  14. // 返回的切片指向一个共享内存,可能被下一次调用Token方法时重写;
  15. // 或被使用该Scanstate的另一个Scan函数重写;或者在本次调用的Scan方法返回时重写。
  16. Token(skipSpace bool, f func(rune) bool) (token []byte, err error)
  17. // Width返回返回宽度值,及其是否被设置。单位是unicode码值。
  18. Width() (wid int, ok bool)
  19. // 因为本接口实现了ReadRune方法,Read方法永远不应被在Scanner接口中使用。
  20. // 一个合法的ScanStat接口实现可能会选择让本方法总是返回错误。
  21. Read(buf []byte) (n int, err error)
  22. }

type Scanner

当Scan、Scanf、Scanln或类似函数接受实现了Scanner接口的类型(其Scan方法的receiver必须是指针,该方法从输入读取该类型值的字符串表示并将结果写入receiver)作为参数时,会调用其Scan方法进行定制的扫描

  1. type Scanner interface {
  2. Scan(state ScanState, verb rune) error
  3. }

控制台

func Printf(format string, a …interface{}) (n int, err error)

  • Printf根据format参数生成格式化的字符串并写入标准输出。返回写入的字节数和遇到的任何错误

func Print(a …interface{}) (n int, err error)

  • Print采用默认格式将其参数格式化并写入标准输出。如果两个相邻的参数都不是字符串,会在它们的输出之间添加空格。返回写入的字节数和遇到的任何错误。

func Println(a …interface{}) (n int, err error)

  • Println采用默认格式将其参数格式化并写入标准输出。总是会在相邻参数的输出之间添加空格并在输出结束后添加换行符。返回写入的字节数和遇到的任何错误。

func Scan(a …interface{}) (n int, err error)

  • Scan从标准输入扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因。

func Scanln(a …interface{}) (n int, err error)

  • Scanln类似Scan,但会在换行时才停止扫描。最后一个条目后必须有换行或者到达结束位置。

func Scanf(format string, a …interface{}) (n int, err error)

  • Scanf从标准输入扫描文本,根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。

字符串格式化

func Sprintf(format string, a …interface{}) string

  • Sprintf根据format参数生成格式化的字符串并返回该字符串。

func Sprint(a …interface{}) string

  • Sprint采用默认格式将其参数格式化,串联所有输出生成并返回一个字符串。如果两个相邻的参数都不是字符串,会在它们的输出之间添加空格。

func Sprintln(a …interface{}) string

  • Sprintln采用默认格式将其参数格式化,串联所有输出生成并返回一个字符串。总是会在相邻参数的输出之间添加空格并在输出结束后添加换行符。

func Sscanf(str string, format string, a …interface{}) (n int, err error)

  • Sscanf从字符串str扫描文本,根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。

func Sscan(str string, a …interface{}) (n int, err error)

  • Sscan从字符串str扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因。

func Sscanln(str string, a …interface{}) (n int, err error)

  • Sscanln类似Sscan,但会在换行时才停止扫描。最后一个条目后必须有换行或者到达结束位置。

文件

func Fprintf(w io.Writer, format string, a …interface{}) (n int, err error)

  • Fprintf根据format参数生成格式化的字符串并写入w。返回写入的字节数和遇到的任何错误。

func Fprint(w io.Writer, a …interface{}) (n int, err error)

  • Fprint采用默认格式将其参数格式化并写入w。如果两个相邻的参数都不是字符串,会在它们的输出之间添加空格。返回写入的字节数和遇到的任何错误。

func Fprintln(w io.Writer, a …interface{}) (n int, err error)

  • Fprintln采用默认格式将其参数格式化并写入w。总是会在相邻参数的输出之间添加空格并在输出结束后添加换行符。返回写入的字节数和遇到的任何错误。

func Fscanf(r io.Reader, format string, a …interface{}) (n int, err error)

  • Fscanf从r扫描文本,根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。

func Fscan(r io.Reader, a …interface{}) (n int, err error)

  • Fscan从r扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因。

func Fscanln(r io.Reader, a …interface{}) (n int, err error)

  • Fscanln类似Fscan,但会在换行时才停止扫描。最后一个条目后必须有换行或者到达结束位置。

error类型

func Errorf(format string, a …interface{}) error

  • Errorf根据format参数生成格式化字符串并返回一个包含该字符串的错误。
  • 如果格式说明符包含带有错误操作数的%w谓词,则返回的错误将实现一个返回操作数的Unwrap方法。包含多个%w动词或为其提供没有实现错误接口的操作数是无效的。