zoukankan      html  css  js  c++  java
  • 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("%+v",user)
    	fmt.Println()
    	//值类型的Go语法表示形式
    	fmt.Printf("%T",user)
    	fmt.Println()
    	fmt.Printf("%%")
    }
    
    输出:
    {xiaoming 13}
    main.User{Name:"xiaoming", Age:13}
    {Name:xiaoming Age:13}
    main.User
    %
    

    2. 常用类型

    2.1 整数类型:
    
    %b     二进制表示 
    %c     相应Unicode码点所表示的字符 
    %d     十进制表示 
    %o     八进制表示 
    %q     单引号围绕的字符字面值,由Go语法安全地转义 
    %x     十六进制表示,字母形式为小写 a-f 
    %X     十六进制表示,字母形式为大写 A-F 
    %U     Unicode格式:123,等同于 "U+007B"
    

    示例:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	fmt.Printf("%b",123)
    	fmt.Println()
    	fmt.Printf("%c",123)
    	fmt.Println()
    	fmt.Printf("%d",123)
    	fmt.Println()
    	fmt.Printf("%0",123)
    	fmt.Println()
    	fmt.Printf("%q",123)
    	fmt.Println()
    	fmt.Printf("%x",123)
    	fmt.Println()
    	fmt.Printf("%X",123)
    	fmt.Println()
    	fmt.Printf("%U",123)
    	fmt.Println()
    }
    
    输出:
    1111011
    {
    123
    %!(NOVERB)%!(EXTRA int=123)
    '{'
    7b
    7B
    U+007B
    
    2.2 浮点数
    %b    无小数部分、二进制指数的科学计数法,如-123456p-78;
    	  参见strconv.FormatFloat %e    科学计数法,如-1234.456e+78 %E    
    	  科学计数法,如-1234.456E+78 %f    
    	  有小数部分但无指数部分,如123.456 %F    等价于%f %g    
    	  根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
    	  
    %e     科学计数法,例如 -1234.456e+78 
    %E     科学计数法,例如 -1234.456E+78 
    %f     有小数点而无指数,例如 123.456 
    %g     根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的0)输出 
    %G     根据情况选择 %E 或 %f 以产生更紧凑的(无末尾的0)输出
    

    示例:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	fmt.Printf("%b",12675757563.5345432567)
    	fmt.Println()
    	fmt.Printf("%e",12675757563.5345432567)
    	fmt.Println()
    	fmt.Printf("%E",12675757563.5345432567)
    	fmt.Println()
    	fmt.Printf("%f",12675757563.5345432567)
    	fmt.Println()
    	fmt.Printf("%g",12675757563.5345432567)
    	fmt.Println()
    	fmt.Printf("%G",12675757563.5345432567)
    	fmt.Println()
    }
    
    输出:
    6645747581470399p-19
    1.267576e+10
    1.267576E+10
    12675757563.534544
    1.2675757563534544e+10
    1.2675757563534544E+10
    
    
    2.3 布尔型
    %t   true 或 false
    
    2.4 字符串
    %s     字符串或切片的无解译字节 
    %q     双引号围绕的字符串,由Go语法安全地转义 
    %x     十六进制,小写字母,每字节两个字符 
    %X     十六进制,大写字母,每字节两个字符
    

    示例:

    package main
    
    import (
    	"fmt"
    )
    
    
    func main() {
    	//user := User{"xiaoming", 13}
    	fmt.Printf("%s","I'm a girl")
    	fmt.Println()
    	fmt.Printf("%q","I'm a girl")
    	fmt.Println()
    	fmt.Printf("%x","I'm a girl")
    	fmt.Println()
    	fmt.Printf("%X","I'm a girl")
    	fmt.Println()
    }
    输出:
    I'm a girl
    "I'm a girl"
    49276d2061206769726c
    49276D2061206769726C
    
    2.5 指针
    %p     十六进制表示,前缀 0x
    

    示例:

    package main
    
    import (
    	"fmt"
    )
    
    func main() {
    	a := 1
    	b := &a
    	fmt.Printf("%p",b)
    }
    
    输出:
    0xc00000c0a8
    指针的地址
    
    2.6 其他标志
    +     总打印数值的正负号;对于%q(%+q)保证只输出ASCII编码的字符。 
    -     左对齐 
    #     备用格式:为八进制添加前导 0(%#o),为十六进制添加前导 0x(%#x)或0X(%#X),为 %p(%#p)去掉前导 0x;对于 %q,若 strconv.CanBackquote 返回 true,就会打印原始(即反引号围绕的)字符串;如果是可打印字符,%U(%#U)会写出该字符的Unicode编码形式(如字符 x 会被打印成 U+0078 'x')。 
    ' '  (空格)为数值中省略的正负号留出空白(% d);以十六进制(% x, % X)打印字符串或切片时,在字节之间用空格隔开 
    0     填充前导的0而非空格;对于数字,这会将填充移到正负号之后
    

    示例:

    func main() {
    	str := `duduud
    		ffff
    				nnnnn`
    	fmt.Printf("%d",323)
    	fmt.Println()
    	fmt.Printf("%s",str)
    	fmt.Println()
    	fmt.Printf("%s    %d","aaaa",10)
    	fmt.Println()
    	fmt.Printf("%s
    %d","aaaa",10)
    
    }
    
    输出:
    323
    duduud
    		ffff
    				nnnnn
    aaaa    10
    aaaa
    10
    
    2.7 格式化错误的提示

    格式化错误.所有的错误都始于“%!”,有时紧跟着单个字符(占位符),并以小括号括住的描述结尾。

    func main() {
    	fmt.Printf("%s",2) //%%!s(int=2)
    }
    
  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/rickiyang/p/11074171.html
Copyright © 2011-2022 走看看