Go中的fmt几种输出的区别和格式化方式
在日常使用fmt
包的过程中,各种眼花缭乱的print
是否让你莫名的不知所措呢,更让你茫然的是各种格式化的占位符。。简直就是噩梦。今天就让我们来征服格式化输出,做一个会输出的Goer。
fmt.Print
有几个变种:
Print: 输出到控制台,不接受任何格式化操作
Println: 输出到控制台并换行
Printf : 只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出别的类型)
Sprintf:格式化并返回一个字符串而不带任何输出
Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout
1. 通用的占位符
%v 值的默认格式。
%+v 类似%v,但输出结构体时会添加字段名
%#v 相应值的Go语法表示
%T 相应值的类型的Go语法表示
%% 百分号,字面上的%,非占位符含义
默认格式%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[]
示例:
package main
import (
"fmt"
"strconv"
)
type User struct {
Name string
Age int
}
func (User) GetUser(user User) string{
return user.Name + " " + strconv.Itoa(user.Age)
}
func main() {
user := User{
"xiaoming", 13}
//Go默认形式
fmt.Printf("%v",user)
fmt.Println()
//类型+值对象
fmt.Printf("%#v",user)
fmt.Println()
//输出字段名和字段值形式
fmt.Printf