非常教程

Go参考手册

fmt

fmt

  • import "fmt"
  • 概述
  • 索引

概述

fmt 包使用函数实现 I/O 格式化(类似于 C 的 printf 和 scanf 的函数), 格式化参数源自C,但更简单

打印输出

动词:

一般:

%v默认格式的值
	打印结构时,加号标志(%+ v)添加字段名称
%#v是值的Go语法表示
%T是值类型的Go语法表示
%%一个百分号; 消耗没有价值

布尔:

%t	the word true or false

整数:

%b base 2
%c由相应的Unicode代码点表示的字符
%d基数10
%base 8
%q使用Go语法安全转义的单引号字符文字。
%x base 16,af为小写字母
%X base 16,AF大写字母
%U Unicode格式:U + 1234; 与“U +%04X”相同

浮点和复杂的组成部分:

%b十进制科学记数法,指数幂为2,
	以strconv.FormatFloat的方式使用'b'格式,
	例如-123456p-78
%e科学记数法,例如-1.234456e + 78
%E科学记数法,例如-1.234456E + 78
%f小数点但没有指数,例如123.456
%F%f的同义词
对于大指数,%g%e,否则为%f。精度将在下面讨论。
对于大指数,%G%E,否则为%F

字符串和字节片段(与这些动词等同处理):

%s字符串或切片的未解释字节
%q使用Go语法安全转义双引号字符串
%x base 16,小写,每个字节两个字符
%X base 16,大写,每个字节两个字符

指针:

%p base 16表示法,带前导0x

%v的默认格式是:

bool:                    %t
int, int8 etc.:          %d
uint, uint8 etc.:        %d, %#x if printed with %#v
float32, complex64, etc: %g
string:                  %s
chan:                    %p
pointer:                 %p

对于复合对象,使用这些规则以递归方式打印元素,如下所示:

struct:             {field0 field1 ...}
array, slice:       [elem0 elem1 ...]
maps:               map[key1:value1 key2:value2]
pointer to above:   &{}, &[], &map[]

宽度由动词前面的可选十进制数字指定。如果不存在,则宽度是表示该值所需的任何值。在(可选)宽度之后指定精度,后面跟着一个十进制数。如果没有句点,则使用默认精度。没有以下数字的时间段指定零的精度。例子:

%f     default width, default precision
%9f    width 9, default precision
%.2f   default width, precision 2
%9.2f  width 9, precision 2
%9.f   width 9, precision 0

宽度和精度是以 Unicode 代码点为单位测量的,即符文。(这与C的 printf 不同,后者的单位总是以字节为单位)。其中一个或两个标志都可以用字符 '*' 替换,使得它们的值从下一个操作数获得,该操作数必须是 int 类型。

对于大多数值,width 是要输出的最小符号数,如果需要,可以用空格填充格式化的表单。

然而,对于字符串,字节片段和字节数组,精度会限制要格式化的输入的长度(而不是输出的大小),如果需要则会截断。通常以符文测量,但对于使用 %x 或 %X 格式格式化的这些类型,则以字节为单位进行测量。

对于浮点值,宽度设置字段的最小宽度,精度设置小数点后的位数(如果适用),但%g/%G精度设置有效数字的总数。例如,给定 12.345 格式%6.3f 打印输出 12.345,而%.3g 打印输出 12.3。%e,%f和%#g的默认精度为6;对于%g,它是唯一标识值所需的最小位数。

对于复数,宽度和精度独立应用于这两个组件,并将结果括起来,因此 %f 应用于1.2 + 3.4i会产生(1.200000 + 3.400000i)。

其他标志:

+始终打印数字值的符号;
	保证%q(%+ q)的仅ASCII输出
- 在右侧而不是左侧使用空格(左侧对齐场)
#alternate format:为八进制添加前导0(%#o),为十六进制添加0x(%#x);
	十六进制为0X(%#X); 抑制%p为%p(%#p);
	对于%q,如果strconv.CanBackquote打印一个原始(反引号)字符串
	返回true;
	始终为%e,%E,%f,%F,%g和%G打印小数点;
	不要删除%g和%G的尾随零;
	如果字符可打印为%U(%#U),则写入例如U + 0078'x'。
''(空格)留下一个空格,用于删除号码(%d);
	在字节之间放置以十六进制打印字符串或切片的空格(%x,%X)
0垫带前导零而不是空格;
	对于数字,这会在符号后移动填充

标志被不期望它们的动词忽略。例如,没有替代的十进制格式,因此 %#d 和 %d 的行为相同。

对于每个类似 Printf 的函数,还有一个不带格式的打印函数,相当于对每个操作数表示 %v。另一个变体 Println 在操作数之间插入空格并附加换行符。

无论动词如何,如果操作数是接口值,则使用内部具体值,而不是接口本身。从而:

var i interface{} = 23
fmt.Printf("%v\n", i)

将打印23。

除使用动词 %T 和 %p 打印外,特殊的格式考虑适用于实现某些接口的操作数。按申请顺序:

  1. 如果操作数是 reflect.Value,则操作数将由其保存的具体值替换,打印将继续执行下一个规则。

2. 如果一个操作数实现了Formatter接口,它将被调用。格式化程序可以很好地控制格式。

3. 如果%v verb 与#flag(%#v)一起使用,并且操作数实现 GoStringer 接口,则会调用该语句。如果格式(对于 Println 等隐式为 %v)对字符串(%s%q%v%x%X)有效,则适用以下两个规则:

4. 如果操作数实现了错误接口,则将调用 Error 方法将对象转换为字符串,然后根据动词的需要对其进行格式化(如果有)。

5. 如果操作数实现方法 String() 字符串,则将调用该方法将对象转换为字符串,然后根据动词(如果有)格式化该字符串。

对于复合操作数(如切片和结构),格式以递归方式应用于每个操作数的元素,而不是作为整体应用于操作数。因此,%q将引用一个字符串片段的每个元素,%6.2f 将控制浮点数组的每个元素的格式。

但是,当使用类似字符串的动词(%s%q%x%X)打印字节切片时,它将作为单个项目与字符串相同地处理。

避免在诸如此类的情况下递归

type X string
func (x X) String() string { return Sprintf("<%s>", x) }

在重复之前转换值:

func (x X) String() string { return Sprintf("<%s>", string(x)) }

无限递归也可以由自引用数据结构触发,例如包含自身作为元素的切片,如果该类型具有String方法。然而,这种病症是罕见的,并且包装不能防止它们。

打印结构时,fmt不能,因此不会在未导出的字段上调用错误或字符串等格式化方法。

显式参数索引:

在Printf,Sprintf和Fprintf中,默认行为是每个格式化动词格式化调用中传递的连续参数。但是,紧接在动词之前的符号[n]表示要格式化第n个单索引参数。宽度或精度的'*'前面的相同符号选择保存该值的参数索引。在处理括号内的表达式[n]之后,除非另有指示,否则后续动词将使用参数n + 1,n + 2等。

例如,

fmt.Sprintf("%[2]d %[1]d\n", 11, 22)

将产生“22 11”,而

fmt.Sprintf("%[3]*.[2]*[1]f", 12.0, 2, 6)

相当于

fmt.Sprintf("%6.2f", 12.0)

将产生“12.00”。因为显式索引会影响后续动词,所以通过重置要重复的第一个参数的索引,可以使用此表示法多次打印相同的值:

fmt.Sprintf("%d %d %#[1]x %#x", 16, 17)

将产生“16 17 0x10 0x11”。

格式错误:

如果为动词提供了无效参数,例如向%d提供字符串,则生成的字符串将包含问题的描述,如下例所示:

Wrong type or unknown verb: %!verb(type=value)
	Printf("%d", hi):          %!d(string=hi)
Too many arguments: %!(EXTRA type=value)
	Printf("hi", "guys"):      hi%!(EXTRA string=guys)
Too few arguments: %!verb(MISSING)
	Printf("hi%d"):            hi%!d(MISSING)
Non-int for width or precision: %!(BADWIDTH) or %!(BADPREC)
	Printf("%*s", 4.5, "hi"):  %!(BADWIDTH)hi
	Printf("%.*s", 4.5, "hi"): %!(BADPREC)hi
Invalid or invalid use of argument index: %!(BADINDEX)
	Printf("%*[2]d", 7):       %!d(BADINDEX)
	Printf("%.[2]d", 7):       %!d(BADINDEX)

所有错误都以字符串“%!”开头。有时候是一个字符(动词),最后是带括号的描述。

如果错误或字符串方法在打印例程调用时触发了混乱,则fmt软件包会从恐慌中重新格式化错误消息,并通过fmt软件包指示它。例如,如果 String 方法调用panic(“bad”),则生成的格式化消息将如下所示

%!s(PANIC=bad)

%!s只显示故障发生时使用的打印动词。但是,如果由 nil接收器引起的错误或字符串方法引起的混乱,则输出是未修饰的字符串“<nil>”。

扫描

一组类似的函数扫描格式化文本以产生值。从os.Stdin 读取Scan,Scanf 和 Scanln;Fscan,Fscanf 和 Fscanln 从指定的io.Reader读取; Sscan,Sscanf 和 Sscanln 从参数字符串中读取。

Scan,Fscan,Sscan 将输入中的换行符视为空格。

Scanln,Fscanln 和 Sscanln 在换行符处停止扫描并要求项目后跟换行符或 EOF。

Scanf,Fscanf 和 Sscanf 根据格式字符串解析参数,类似于 Printf 的格式字符串。在下面的文本中,'space' 表示除换行符之外的任何 Unicode 空白字符。

在格式字符串中,%字符引入的动词消耗并解析输入;这些动词在下面更详细地描述。格式中除%,空格或换行符之外的字符恰好消耗必须存在的输入字符。在格式字符串中具有零个或多个空格的换行符在输入中使用零个或多个空格,后跟单个换行符或输入的结尾。格式字符串中换行符后面的空格在输入中占用零个或多个空格。否则,格式字符串中的一个或多个空格的任何运行在输入中消耗尽可能多的空格。除非格式字符串中的空格运行与换行符相邻,否则运行必须至少占用输入的一个空格或找到输入的结尾。

空格和换行符的处理与C的 scanf 系列的处理不同:在C中,换行符被视为任何其他空格,当格式字符串中的空格行没有在输入中消耗空间时,它永远不会出错。

动词的行为类似于 Printf。例如,%x 将整数扫描为十六进制数,%v 将扫描该值的默认表示格式。Printf 动词 %p和 %T 以及标志#和+未实现,动词 %e%E%f%F%g和%G 都是等效的,并扫描任何浮点或复数值。

由动词处理的输入是隐式空格分隔的:除了 %c 之外的每个动词的实现都是从剩余输入中丢弃前导空格开始的,而 %s 动词(和 %v 读入字符串)在第一个空格处停止消耗输入或换行符。

当扫描没有格式的整数或使用%v动词时,接受熟悉的基本设置前缀0(八进制)和0x(十六进制)。

宽度在输入文本中解释,但没有精确扫描的语法(没有 %5.2f,只有 %5f)。如果提供了宽度,则在修剪前导空格后应用宽度,并指定要读取的最大符文数以满足动词。例如,

Sscanf(" 1234567 ", "%5s%d", &s, &i)

将s设置为“12345”,将i设置为67

Sscanf(" 12 34 567 ", "%5s%d", &s, &i)

将s设置为“12”,将i设置为 34。

在所有扫描功能中,紧接着换行后的回车被视为普通换行符(\r\n 表示与\n 相同)。

在所有扫描功能中,如果操作数实现方法 Scan(即,它实现了 Scanner 接口),则该方法将用于扫描该操作数的文本。此外,如果扫描的参数数量小于提供的参数数量,则返回错误。

要扫描的所有参数必须是指向基本类型的指针或 Scanner 接口的实现。

与 Scanf 和 Fscanf 一样,Sscanf 无需消耗其全部输入。无法恢复使用的输入字符串 Sscanf 的数量。

注意:Fscan 等可以读取它们返回的输入之后的一个字符(符文),这意味着调用扫描例程的循环可能会跳过某些输入。仅当输入值之间没有空格时,这通常是一个问题。如果提供给 Fscan 的阅读器实现了 ReadRune,那么该方法将用于读取字符。如果读者也实现了 UnreadRune,那么该方法将用于保存字符,连续调用不会丢失数据。要将 ReadRune 和 UnreadRune 方法附加到没有该功能的阅读器,请使用 bufio.NewReader。

索引

  • func Errorf(format string, a ...interface{}) error
  • func Fprint(w io.Writer, a ...interface{}) (n int, err error)
  • func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
  • func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
  • func Fscan(r io.Reader, a ...interface{}) (n int, err error)
  • func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
  • func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
  • func Print(a ...interface{}) (n int, err error)
  • func Printf(format string, a ...interface{}) (n int, err error)
  • func Println(a ...interface{}) (n int, err error)
  • func Scan(a ...interface{}) (n int, err error)
  • func Scanf(format string, a ...interface{}) (n int, err error)
  • func Scanln(a ...interface{}) (n int, err error)
  • func Sprint(a ...interface{}) string
  • func Sprintf(format string, a ...interface{}) string
  • func Sprintln(a ...interface{}) string
  • func Sscan(str string, a ...interface{}) (n int, err error)
  • func Sscanf(str string, format string, a ...interface{}) (n int, err error)
  • func Sscanln(str string, a ...interface{}) (n int, err error)
  • type Formatter
  • type GoStringer
  • type ScanState
  • type Scanner
  • type State
  • type Stringer

包文件

doc.go format.go print.go scan.go

func Errorf(显示源代码)

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

Errorf 格式根据格式说明符并返回字符串作为满足错误的值。

func Fprint(显示源代码)

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

使用其操作数的缺省格式并写入w的 Fprint 格式。当两个操作数都不是字符串时,空间会被添加。它返回写入的字节数和遇到的任何写入错误。

func Fprintf(显示源代码)

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

Fprintf 根据格式说明符格式化并写入w。它返回写入的字节数和遇到的任何写入错误。

func Fprintln(显示源代码)

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

Fprintln 使用其操作数的默认格式格式化并写入w。总是在操作数之间添加空格,并附加一个换行符。它返回写入的字节数和遇到的任何写入错误。

func Fscan(显示源代码)

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

Fscan 扫描从r读取的文本,将连续的空格分隔值存储为连续的参数。换行占据空间。它返回成功扫描的项目数量。如果这小于参数的数量,err 会报告原因。

func Fscanf(显示源代码)

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

Fscanf 扫描从 r 读取的文本,将连续的空格分隔值存储为由格式确定的连续参数。它返回成功解析的项目数。输入中的换行符必须与格式中的换行符匹配。

func Fscanln(显示源代码)

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

Fscanln 与 Fscan 类似,但停止在换行符处进行扫描,并且在最终项目后必须有换行符或 EOF。

func Print(显示源代码)

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

使用其操作数的默认格式打印格式并写入标准输出。当两个操作数都不是字符串时,空间会被添加。它返回写入的字节数和遇到的任何写入错误。

func Printf(显示源代码)

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

Printf 格式根据格式说明符写入标准输出。它返回写入的字节数和遇到的任何写入错误。

func Println(显示源代码)

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

Println 格式使用其操作数的默认格式并写入标准输出。总是在操作数之间添加空格,并附加一个换行符。它返回写入的字节数和遇到的任何写入错误。

func Scan(显示源代码)

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

扫描扫描从标准输入读取的文本,将连续的空格分隔值存储为连续的参数。换行占据空间。它返回成功扫描的项目数量。如果这小于参数的数量,err 会报告原因。

func Scanf(显示源代码)

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

Scanf 扫描从标准输入中读取的文本,将连续的空格分隔值存储为由格式确定的连续参数。它返回成功扫描的项目数量。如果这小于参数的数量,err 会报告原因。输入中的换行符必须与格式中的换行符匹配。一个例外:动词%c总是扫描输入中的下一个符文,即使它是空格(或制表符等)或换行符。

func Scanln(显示源代码)

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

Scanln 与 Scan 类似,但停止在换行符处进行扫描,并且在最终项目后必须有换行符或 EOF。

func Sprint(显示源代码)

func Sprint(a ...interface{}) string

Sprint 格式使用其操作数的默认格式并返回结果字符串。当两个操作数都不是字符串时,空间会被添加。

func Sprintf(显示源代码)

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

Sprintf 根据格式说明符格式化并返回结果字符串。

func Sprintln(显示源代码)

func Sprintln(a ...interface{}) string

Sprintln 格式使用其操作数的默认格式并返回结果字符串。总是在操作数之间添加空格,并附加一个换行符。

func Sscan(显示源代码)

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

Sscan 扫描参数字符串,将连续的空格分隔值存储为连续的参数。换行占据空间。它返回成功扫描的项目数量。如果这小于参数的数量,err 会报告原因。

func Sscanf(显示源代码)

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

Sscanf 扫描参数字符串,将连续的空格分隔值存储为由格式确定的连续参数。它返回成功解析的项目数。输入中的换行符必须与格式中的换行符匹配。

func Sscanln(显示源代码)

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

Sscanln 与 Sscan 类似,但停止在换行符处进行扫描,并且在最终项目后必须有换行符或 EOF。

type Formatter(显示源代码)

格式化程序是通过使用自定义格式化程序的值实现的接口。Format 的实现可能会调用 Sprint(f) 或 Fprint(f) 等来生成其输出。

type Formatter interface {
        Format(f State, c rune)
}

type GoStringer(显示源代码)

GoStringer 由具有 GoString 方法的任何值实现,该方法定义该值的 Go 语法。GoString 方法用于将作为操作数传递给 %#v 格式的值打印出来。

type GoStringer interface {
        GoString() string
}

type ScanState(显示源代码)

ScanState 表示传递给定制扫描仪的扫描仪状态。扫描仪可以做一次一个符号扫描,或要求 ScanState 发现下一个由空格分隔的令牌。

type ScanState interface {
        // ReadRune从输入中读取下一个符文(Unicode代码点)。
        // 如果在Scanln,Fscanln或Sscanln期间调用,ReadRune()将会
        // 返回第一个'\n'或读取超出后返回EOF
        // 指定的宽度。
        ReadRune() (r rune, size int, err error)
        // UnreadRune导致下一次调用ReadRune返回相同的符文。
        UnreadRune() error
        // SkipSpace会跳过输入中的空格。 新线得到适当的处理
        // 正在进行的操作; 请参阅包文档
        // 了解更多信息。
        SkipSpace()
        // 如果skipSpace为true,Token会跳过输入中的空格,然后返回
        // 运行Unicode代码点c满足f(c)。 如果f为零,
        // !unicode.IsSpace(c)用于; 也就是说,令牌将保持非空格
        // 字符。 对于正在进行的操作,新线被适当地处理
        // 执行; 有关更多信息,请参阅包文档。
        // 返回的切片指向可能被覆盖的共享数据
        // 通过下一次调用Token,使用ScanState调用Scan功能
        // 作为输入,或当调用Scan方法返回时。
        Token(skipSpace bool, f func(rune) bool) (token []byte, err error)
        // Width返回width选项的值以及是否已设置。
        // 该单位是Unicode代码点。
        Width() (wid int, ok bool)
        // 因为ReadRune是由接口实现的,所以Read永远不应该
        // 由扫描例程和有效实现调用
        // ScanState可以选择始终从Read返回错误。
        Read(buf []byte) (n int, err error)
}

type Scanner(显示源代码)

扫描器是由任何具有 Scan 方法的值实现的,Scan 方法扫描输入以表示值并将结果存储在接收器中,该接收器必须是有用的指针。扫描方法被称为 Scan,Scanf 或 Scanln 的任何参数来实现它。

type Scanner interface {
        Scan(state ScanState, verb rune) error
}

type State(显示源代码)

状态表示传递给自定义格式化程序的打印机状态。它提供对io.Writer 接口的访问,以及有关操作数格式说明符的标志和选项的信息。

type State interface {
        // Write是调用以发出要打印的格式化输出的函数。
        Write(b []byte) (n int, err error)
        // Width返回width选项的值以及是否已设置。
        Width() (wid int, ok bool)
        // Precision返回精度选项的值以及是否已设置。
        Precision() (prec int, ok bool)

        // 标志报告是否已设置标志c(字符)。
        Flag(c int) bool
}

type Stringer(显示源代码)

Stringer 由具有 String 方法的任何值实现,该方法为该值定义“native”格式。String 方法用于将作为操作数传递的值打印为接受字符串或格式未打印的打印机(如Print)的任何格式。

type Stringer interface {
        String() string
}

fmt相关

Go

Go 是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。

主页 https://golang.org/
源码 https://go.googlesource.com/go
发布版本 1.9.2

Go目录

1.档案 | archive
2.缓冲区 | bufio
3.内置 | builtin
4.字节 | bytes
5.压缩 | compress
6.容器 | container
7.上下文 | context
8.加密 | crypto
9.数据库 | database
10.调试 | debug
11.编码 | encoding
12.错误 | errors
13. expvar
14.flag
15. fmt
16. go
17.散列 | hash
18.html
19.图像 | image
20.索引 | index
21.io
22.日志 | log
23.数学 | math
24. math/big
25.math/bits
26.math/cmplx
27.math/rand
28.拟态 | mime
29.net
30.net/http
31. net/mail
32. net/rpc
33.net/smtp
34. net/textproto
35. net/url
36.os
37.路径 | path
38.插件 | plugin
39.反射 | reflect
40.正则表达式 | regexp
41.运行时 | runtime
42.排序算法 | sort
43.转换 | strconv
44.字符串 | strings
45.同步 | sync
46.系统调用 | syscall
47.测试 | testing
48.文本 | text
49.时间戳 | time
50.unicode
51.不安全性 | unsafe
52.Go 语言数据类型
53.Go 语言基础语法
54.Go 语言结构
55.Go 语言 select 语句
56.Go 语言 switch 语句
57.Go 语言 if 语句嵌套
58.Go 语言 if…else 语句
59.Go 语言 if 语句
60.Go 语言运算符
61.Go 语言常量
62.Go 语言函数闭包
63.Go 语言函数作为实参
64.Go 语言函数引用传递值
65.Go 语言函数值传递值
66.Go 语言函数
67.Go 语言 goto 语句
68.Go 语言 continue 语句
69.Go 语言 break 语句
70.Go 语言循环嵌套
71.Go 语言 for 循环
72.Go 语言结构体
73.Go 语言指针作为函数参数
74.Go 语言指向指针的指针
75.Go 语言指针数组
76.Go 语言指针
77.Go 语言向函数传递数组
78.Go 语言多维数组
79.Go 语言变量作用域
80.Go 语言函数方法
81.Go 错误处理
82.Go 语言接口
83.Go 语言类型转换
84.Go 语言递归函数
85.Go 语言Map(集合)
86.Go 语言范围(Range)
87.Go 语言切片(Slice)
88.Go 并发
89.Go fmt.Sprintf 格式化字符串