Go fmt 库
Printing
fmt包实现了格式化I/O函数,Print() 函数将参数列表 a 中的各个参数转换为字符串并写入到标准输出中。
非字符串参数之间会添加空格,返回写入的字节数。 func Print(a ...interface{}) (n int, err error)
Println() 函数功能类似 Print,只不过最后会添加一个换行符。
所有参数之间会添加空格,返回写入的字节数。 func Println(a ...interface{}) (n int, err error) Printf() 函数将参数列表 a 填写到格式字符串 format 的占位符中。
填写后的结果写入到标准输出中,返回写入的字节数。 func Printf(format string, a ...interface{}) (n int, err error)
package main
import "fmt"
func main() { // ab1 2 3cd fmt.Print("a", "b", 1, 2, 3, "c", "d", "\n") // a b 1 2 3 c d fmt.Println("a", "b", 1, 2, 3, "c", "d") // ab 1 2 3 cd fmt.Printf("ab %d %d %d cd\n", 1, 2, 3)
以下三个函数功能同上面三个函数,只不过将转换结果以字符串形式返回。 func Fprint(w io.Writer, a ...interface{}) (n int, err error) func Fprintln(w io.Writer, a ...interface{}) (n int, err error) func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
以下函数功能同 Sprintf() 函数,只不过结果字符串被包装成了 error 类型。 func Errorf(format string, a ...interface{}) error
实例: package main
import ( "fmt" )
func main() { var error = fmt.Errorf("ab %d %d %d cd\n", 1, 2, 3) // ab 1 2 3 cd fmt.Print(error) }
不考虑占位符的话,如果操作数是接口值,就会使用其内部的具体值,而非接口本身。 因此: 若其格式(它对于Println等函数是隐式的%v)对于字符串是有效的(%s %q %v %x %X),以下两条规则也适用:
若一个操作数实现了 error 接口,Error 方法就能将该对象转换为字符串,随后会根据占位符的需要进行格式化。
若一个操作数实现了 String() string 方法,该方法能将该对象转换为字符串,随后会根据占位符的需要进行格式化。
Formatter 接口
Formatter 由自定义类型实现,用于实现该类型的自定义格式化过程。
当格式化器需要格式化该类型的变量时,会调用其 Format 方法。
Formatter接口的定义如下:
type Formatter interface {
// f 用于获取占位符的旗标、宽度、精度等信息,也用于输出格式化的结果
// c 是占位符中的动词
Format(f State, c rune)
}
由格式化器(Print之类的函数)实现,用于给自定义格式化过程提供信息:
type State interface {
// Formatter 通过 Write 方法将格式化结果写入格式化器中,以便输出。
Write(b []byte) (ret int, err error)
// Formatter 通过 Width 方法获取占位符中的宽度信息及其是否被设置。
Width() (wid int, ok bool)
// Formatter 通过 Precision 方法获取占位符中的精度信息及其是否被设置。
Precision() (prec int, ok bool)
// Formatter 通过 Flag 方法获取占位符中的旗标[+- 0#]是否被设置。
Flag(c int) bool
}
Stringer 接口
Stringer 由自定义类型实现,用于实现该类型的自定义格式化过程。
当格式化器需要输出该类型的字符串格式时就会调用其 String 方法。
Stringer接口的定义如下:
type Stringer interface { String() string }
根据Go语言中实现接口的定义,一个类型只要有 String() string 方法,我们就说它实现了Stringer接口。
如果格式化输出某种类型的值,只要它实现了String()方法,那么会调用String()方法进行处理。