关于golang的fmt模块的样例测试


  本例来自 C:\Go\src\fmt\fmt_test.go
  fmt来讲已经是讲的比较多的了,我就从另外一个角度来看看go源码中的一些测试,实际里面也有一些不确定性。官方的测试。当然测试细节也太繁琐了,只能用到在看了,我也不可能面面俱到了,但是从另外一个角度可以去看出fmt还是有很多小细节的。

说明符类型描述样例
%s string  字符串输出,默认右对齐 
var str5 = "a"
bytestr5:=[]byte(str5)
fmt.Printf("|%10s|\n", string(bytestr5)) //如果是中文一个字也是一个字符,所以输出空格为9个
//| a|
%d int 十进制,默认右对齐
var daligntest int =5
fmt.Printf("|%6d|\n", daligntest) //输出字符宽度为6(就是6个字符)
//|     5|
%-Nd
  -表示左对齐,N表示字符宽度为N

numbertest:=10
fmt.Printf("%-6d|\n",numbertest)  //-6表示左对齐,同时设置6个字符的宽度显示,空的位置用空格填充
//10    |

%f float 浮点数 3.14
%t bool 布尔值 true/false
%p pointer 内存地址 0xc000010090
%v any
%v默认格式输出,可以是任意值,适用于任意类型

var vf3 [3]float64
fmt.Printf("vf3-v: %v\n", vf3) //vf3-v: [0 0 0]

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

%#v   用来查看初始化和数据具体情况

 例子1:
ms:=make([]byte,5)
//%#v,用来查看初始化情况
fmt.Printf("%#v\n", ms)
//[]byte{0x0, 0x0, 0x0, 0x0, 0x0}

    //依据上面的代码,我们可以建立新的变量,初始化代码
    ms2:=[]byte{0x0, 0x0, 0x0, 0x0, 0x0}

content := []byte("this is Go.")
 例子2:
fmt.Printf("%s\n", content) //this is Go.
//%#v显示内部值情况
fmt.Printf("%#v\n", content) //[]byte{0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x47, 0x6f, 0x2e}

 例子3:

var names [3]string
//%#v 输出声明的形式输出
fmt.Printf("name的初始化: %#v\n", names) //name的初始化: [3]string{"", "", ""}

 例如4:

var vbool3 [3]bool
var vf3 [3]float64
fmt.Printf("%#v\n", vbool3) //[3]bool{false, false, false}

       //我们借助上面的代码,就可以声明为下面的方式

 testbool:=[3]bool{false, false, false}

例5:

 

//定义一个数组,每个元素也是数组
//二维数组
d1 := [3][2]int{}
d2 := [3][2]int{
2: [2]int{3, 4},
1: [2]int{1, 2},
0: [2]int{7, 0}}
//有3个元素数组,每个元素是有2个元素的数组
fmt.Printf("d1: %#v\n", d1)
fmt.Printf("d1: %#v\n", d2)
/*
d1: [3][2]int{
[2]int{0, 0},
[2]int{0, 0},
[2]int{0, 0}
}
d1: [3][2]int{
[2]int{7, 0},
[2]int{1, 2},
[2]int{3, 4}
}
*/

例6:

   fmt.Printf("10: %#v\n", [3]string{1: "kk"})

    //[3]string{"", "kk", ""}

%T any 值的类型

var vbool bool
fmt.Printf("%#v\n", vbool) //false
//Go-syntax 打印类型
fmt.Printf("%T\n", vbool) //bool

%b number 二进制数  
%x   十六进制数输出,请看下面的vtest函数
    来自: C:\Go\src\fmt\fmt_test.go
    {"%2x",   []byte{},           "  "},
    {"%#2x",  []byte{},           "  "},
    {"% 02x", []byte{},           "00"},
    {"%# 02x",[]byte{},           "00"},
    {"%-2x",  []byte{},           "  "},
    {"%-02x", []byte{},           "  "},
    {"%8x",   []byte{0xab},       "      ab"},
    {"% 8x",  []byte{0xab},       "      ab"},
    {"%#8x",  []byte{0xab},       "    0xab"},
    {"%# 8x", []byte{0xab},       "    0xab"},
    {"%08x",  []byte{0xab},       "000000ab"},
    {"% 08x", []byte{0xab},       "000000ab"},
    {"%#08x", []byte{0xab},       "00000xab"},
    {"%# 08x",[]byte{0xab},       "00000xab"},
    {"%10x",  []byte{0xab, 0xcd}, "      abcd"},
    {"% 10x", []byte{0xab, 0xcd}, "     ab cd"},
    {"%#10x", []byte{0xab, 0xcd}, "    0xabcd"},
    {"%# 10x",[]byte{0xab, 0xcd}, " 0xab 0xcd"},
    {"%010x", []byte{0xab, 0xcd}, "000000abcd"},
    {"% 010x",[]byte{0xab, 0xcd}, "00000ab cd"},
    {"%#010x",[]byte{0xab, 0xcd}, "00000xabcd"},
    {"%# 010x",[]byte{0xab, 0xcd},"00xab 0xcd"},
    {"%-10X",  []byte{0xab},      "AB        "},
    {"% -010X",[]byte{0xab},      "AB        "},
    {"%#-10X", []byte{0xab, 0xcd},"0XABCD    "},
    {"%# -010X",[]byte{0xab, 0xcd},"0XAB 0XCD "},
%q    转义、请看下面的escapedstrings函数

var ss=`"abc"`
fmt.Printf("|%6s|\n", ss) //6个字符宽度,s默认是右对齐
//| "abc"|


测试大部分来自 C:\Go\src\fmt\fmt_test.go,有些一看就明白的就不做标注了
package main

import(
    "fmt"
)

/*
1.%x 输出十六进制
*/
func vtest(){

    // Padding with byte slices.
    var fmtTests = []struct {
        fmt string
        val interface{}
        out string
    }{
        //[]byte{}属于特殊情况
        {"%2x",    []byte{}, "  "},
        {"%#2x",   []byte{}, "  "}, //2表示占位2个字符宽度,#原始字面值显示
        {"% 02x",  []byte{}, "00"}, //占据2个字符宽度
        {"%# 02x", []byte{}, "00"},
        {"%-2x",   []byte{}, "  "}, //左对齐,2表示占据2个字符宽度
        {"%-02x",  []byte{}, "  "},
        {"%8x",    []byte{0xab}, "      ab"},    //8表示字符宽度为8,其他位置用空格填充
        {"% 8x",   []byte{0xab}, "      ab"}, //%后面的空格表示字符之间用空格
        {"% 10x",  []byte{'a', 'b'}, "     61 62"}, //%右对齐,,10表示字符宽度,x表示16进制显示
        {"%#8x",   []byte{0xab}, "    0xab"},
        {"%# 8x",  []byte{0xab}, "    0xab"},
        {"%08x",   []byte{0xab}, "000000ab"},
        {"% 08x",  []byte{0xab}, "000000ab"}, //8表示8个字符宽度,0表示字符不足部分用0填充
        {"%#08x",  []byte{0xab}, "00000xab"}, //#表示原始字符形式显示,0表示字符不够8,则填充0,8表示8个字符宽度
        {"%# 08x", []byte{0xab}, "00000xab"},
        {"%10x",   []byte{0xab, 0xcd}, "      abcd"}, //一共10个字符
        {"% 10x",  []byte{0xab, 0xcd}, "     ab cd"}, //10表示10个字符宽度,%后的空格表示字节之间按照空格隔开
        {"%#10x",  []byte{0xab, 0xcd}, "    0xabcd"}, //前面以空格填充
        {"%# 10x", []byte{0xab, 0xcd}, " 0xab 0xcd"}, //字符中间以空格隔开,字符宽度一共为10
        {"%010x",  []byte{0xab, 0xcd}, "000000abcd"}, //字符之间无空格,字符宽度一共10个字符,空的用空格填充
        {"% 010x", []byte{0xab, 0xcd}, "00000ab cd"},
        {"%#010x", []byte{0xab, 0xcd}, "00000xabcd"},
        {"%# 010x", []byte{0xab, 0xcd}, "00xab 0xcd"},
        {"%-10X",  []byte{0xab},  "AB        "},  //左对齐,右边以空格填充,一共10个位置
        {"% -010X", []byte{0xab}, "AB        "},
        {"%#-10X",  []byte{0xab, 0xcd},  "0XABCD    "},
        {"%# -010X", []byte{0xab, 0xcd}, "0XAB 0XCD "},
        //#按照原始字符显示,-左对齐,-前面的空格表示字节之间按照空格隔开,10表示10个字符宽度
    }
    //%10.3s:输出字符串的前 3 个字符,总宽度为 10(右对齐)。
    //%10s 是对齐
    for _, tt := range fmtTests {
        fmt.Printf("%10s      %v        %10s \n", tt.fmt,tt.val, tt.out)
    }
}
/*
字符串格式化
1.%s 针对字符串和字节
*/
func stringformatting百分号x(){
    var fmtTests2 = []struct {
        fmt string
        val interface{}
        out string
    }{
        {"%x", "", ""},
        {"% x", "", ""},
        {"%#x", "", ""},
        {"%# x", "", ""},
        {"%s", "abc", "abc"},
        {"%q", "abc", `"abc"`}, //转义" "
        {"%x", "abc", "616263"},  //显示十六进制数
        {"%x", "\xff\xf0\x0f\xff", "fff00fff"},
        {"%X", "\xff\xf0\x0f\xff", "FFF00FFF"},

        {"%x", "xyz", "78797a"},
        {"%X", "xyz", "78797A"},  //z(十六进制A),输出字符大写(如果有字母)
         {"% x", "xyz", "78 79 7a"},
        {"% X", "xyz", "78 79 7A"},  //% X,中间有隔空代表十六进制数会以空格隔开

        {"%#x", "xyz", "0x78797a"},  //输出字符 0x为前缀的十六进制数
        {"%#X", "xyz", "0X78797A"},  //输出字符 0X为之前的十六进制数(字母大写)
         {"%# x", "xyz", "0x78 0x79 0x7a"},
        {"%# X", "xyz", "0X78 0X79 0X7A"},
    }
    for _, tt2 := range fmtTests2 {
        fmt.Printf("%-20s  %v   %-30s \n", tt2.fmt,tt2.val, tt2.out)
    }

}


/*
%q  安全的转义表示
*/
func escapedstrings(){
    var fmtTests = []struct {
        fmt string
        val interface{}
        out string
    }{
        {"%q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`},
        {"%+q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`},
        {"%#q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`},
        {"%#+q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`},

        //#代表字面字符
        {"%#8q", "\n",   `    "\n"`},
        {"%#+8q", "\r",  `    "\r"`},
        {"%#-8q", "\t",  "`    `     "},
        {"%#+-8q", "\b", `"\b"    `},

        {"%q", "\n",   `"\n"`},
        {"%#q", "\n",  `"\n"`},
        {"%q", `\n`,   `"\\n"`},
        {"%#q", `\n`,  "`\\n`"},
        {"%q", "abc",  `"abc"`},
        {"%#q", "abc", "`abc`"},

        {"%q", "",    `""`},
        {"%#q", "",   "``"},
        {"%q", "\"",  `"\""`},
        {"%#q", "\"", "`\"`"},
        {"%q", "`",   `"` + "`" + `"`},
        {"%#q", "`",  `"` + "`" + `"`},

        //输出带引号的字符,这里要注意#的作用,以下分三种情况 
        {"%q", "日本語", `"日本語"`},
     {"%10q", "⌘",    `       "⌘"`}, // 输出10个宽度字符
     {"% q", "☺",      `"☺"`}, // The space modifier should have no effect.
     {"%-10q", "⌘", `"⌘" `}, //-左对齐,10个字符宽度
{"%010q", "⌘", `0000000"⌘"`}, //0表示用0填充空格位置,10表示10个字符宽度,q表示输出转义
{"%q", "abc\xffdef", `"abc\xffdef"`},
{"%-010q", "⌘", `"⌘" `}, // 0 has no effect when - is present.
有#号情况 {"%#q", "日本語", "`日本語`"}, {"%#+q", "日本語", "`日本語`"}, //有#时,+号阻止转成unicode编码 {"%q", "", `""`}, {"%#q", "", "`☺`"}, {"%#+q", "", "`☺`"},
     {"%#q", "abc\xffdef", `"abc\xffdef"`},//#表示字面字符      {"%#+q", "abc\xffdef", `"abc\xffdef"`},

%+q里面的+号表示输出unicode编码

     {"%+q", "", `"\u263a"`}, //+表示转成unicode编码 {"%+10q", "", ` "\u2318"`}, //+代表转成unicode编码,10表示占10个字符宽度,""占据2个字符,前面留个2个空格字符 {"%+q", "日本語", `"\u65e5\u672c\u8a9e"`}, {"%+-10q", "", `"\u2318" `}, //_表示转成unicode字符,-表示左对齐,10表示占据10个字符宽度 {"%+010q", "", `00"\u2318"`}, {"%+-010q", "", `"\u2318" `}, {"%+q", "abc\xffdef", `"abc\xffdef"`}, } for _, tt := range fmtTests { c:=fmt.Sprintf("%q", tt.val) fmt.Printf("%-10s %s %s \n", tt.fmt ,c,tt.out) } } func Runestest(){ var fmtTests = []struct { fmt string val interface{} out string }{ // Runes打印不了 {"%q", "\U0010ffff", `"\U0010ffff"`}, {"%+q", "\U0010ffff", `"\U0010ffff"`}, {"%#q", "\U0010ffff", "`􏿿`"}, {"%#+q", "\U0010ffff", "`􏿿`"}, // Runes不是有效值,%q 反义 {"%q", string(rune(0x110000)), `""`}, //输出带引号的字符串 {"%+q", string(rune(0x110000)), `"\ufffd"`}, {"%#q", string(rune(0x110000)), "`�`"}, {"%#+q", string(rune(0x110000)), "`�`"}, //rune字符举例 %c打印unicode字符 //%c表示输出unicode字符 {"%c", uint('x'), "x"}, {"%c", 0xe4, "ä"}, {"%c", 0x672c, ""}, {"%c", '', ""}, {"%.0c", '', ""}, //.0表示截取1个 {"%3c", '', ""}, //如果字符串是unicode字符,则不变,3表示占据宽度,不足3个字符,用空格填充 {"%-3c", '', ""}, } for _, tt := range fmtTests { c:=fmt.Sprintf("%q",tt.val) fmt.Printf("%-10s %q %s \n", tt.fmt,c,tt.out) } } func widthtest(){ var fmtTests = []struct { fmt string val interface{} out string }{ {"%5s", "abc", " abc"}, //最大宽度5,不足部分空格填补 {"%5s", []byte("abc"), " abc"}, {"%2s", "\u263a", ""}, //最大宽度2,不足部分空格填补 {"%2s", []byte("\u263a"), ""}, {"%-5s", "abc", "abc "}, //左对齐,最大宽度5,不足部分空格填补 {"%-5s", []byte("abc"), "abc "}, //左对齐 {"%05s", "abc", "00abc"}, //右对齐,最大宽度5个字符,空格用0填充 {"%05s", []byte("abc"), "00abc"}, ////右对齐,空格用0填充 {"%5s", "abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"}, //如果字符宽度超过5,则默认显示 {"%5s", []byte("abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz"}, //-符号表示左对齐 {"%08q", "abc", `000"abc"`}, //最大宽度8,不足部分用0填充,""算2个字符宽度 {"%-8q", "abc", `"abc" `}, //左对齐,宽度为8,空余部分留空 {"%-8q", []byte("abc"), `"abc" `}, // //右对齐,10个空格 {"%10v", nil, " <nil>"}, {"%-10v", nil, "<nil> "}, //<nil>算5个字符,空余5个,左对齐 //.的作用是截取几个字符、字节等 {"%.5s", "abcdefghijklmnopqrstuvwxyz", "abcde"}, {"%.0s", "日本語日本語", ""}, {"%.0s", []byte("日本語日本語"), ""}, //.0表示不截取,输出空 {"%.5s", "日本語日本語", "日本語日本"}, //.5表示截取5个rune字符 {"%.5s", []byte("日本語日本語"), "日本語日本"}, {"%.10s", "日本語日本語", "日本語日本語"}, //.10表示截取10个rune字符,但是不足10个,所以都截取 {"%.10s", []byte("日本語日本語"), "日本語日本語"}, {"%.6x", []byte("abcdefghijklmnopqrstuvwxyz"), "6162636465"}, //打印[]byte中的6个字节 {"%.5q", "abcdefghijklmnopqrstuvwxyz", `"abcde"`}, {"%.5q", []byte("abcdefghijklmnopqrstuvwxyz"), `"abcde"`}, {"%.5x", "abcdefghijklmnopqrstuvwxyz", "6162636465"}, {"%.4q", "日本語日本語", `"日本語日"`}, //打印字符串中的4个 {"%.1q", "日本語", `""`}, //截取1个rune字符串 {"%.1q", []byte("日本語"), `""`}, {"%.1x", "日本語", "e6"}, //截取日字第一个字节的内容 {"%.1X", []byte("日本語"), "E6"},//截取日字第一个字节的内容 {"%10.1q", "日本語日本語", ` ""`}, {"%10.1q", []byte("日本語日本語"), ` ""`}, //10代表显示10个字符宽度,.1表示截取1个rune字符 q显示十进制 {"%.10s", []byte("abcdefghijklmnopqrstuvwxyz"), "abcdefghij"}, //.10截取10个字符,这个在 C:\Go\src\fmt\fmt_test.go 中是错误的 {"%08q", []byte("abc"), `000"abc"`}, {"%.3q", []byte("日本語日本語"), `"日本語"`},//.3表示打印字节数组中的3个字符 } format := "%-10v %3v %2v \n" for _, tt := range fmtTests { c:= fmt.Sprintf(tt.fmt, tt.val) //Sprintf返回接收 fmt.Printf(format,tt.fmt,tt.val,c) } fmt.Printf("% x\n",[]byte("日本語日本語")) //输出十六进制数 e6 97 a5 e6 9c ac e8 aa 9e e6 97 a5 e6 9c ac e8 aa 9e //一个汉字一般占3个字节 fmt.Printf("%0.1x\n",[]byte("日本語日本語")) //"e6" //截取日字第一个字节的内容 fmt.Printf("% d\n",[]byte("日本語日本語")) //[ 230 151 165 230 156 172 232 170 158 230 151 165 230 156 172 232 170 158] //正确写法 fmt.Printf("% .3q\n",[]byte("日本語日本語")) //"日本語" //下面是错误写法 //fmt.Printf("%.3 q\n",[]byte("日本語日本語")) fmt.Printf("%.5q",[]byte("a日本b語日本語")) //"a日本b語" fmt.Printf("%.3q",[]byte("日本語日本語")) //"日本語" } func Ttest(){ /* {"%T", byte(0), "uint8"}, {"%T", reflect.ValueOf(nil), "reflect.Value"}, {"%T", (4 - 3i), "complex128"}, {"%T", renamedComplex128(4 - 3i), "fmt_test.renamedComplex128"}, {"%T", intVar, "int"}, {"%6T", &intVar, " *int"}, //占据6个字符,右对齐输出 {"%10T", nil, " <nil>"}, //占据10个字符,右对齐输出 {"%-10T", nil, "<nil> "}, //左对齐输出 */ } //#p指针测试 func testpoint(){ var intVar int=0 var fmtTests = []struct { fmt string val interface{} out string }{ // %p with pointers {"%p", (*int)(nil), "0x0"}, {"%#p", (*int)(nil), "0"}, {"%v", nil, "<nil>"}, //按照原始值输出 {"%#v", nil, "<nil>"}, {"%8.2p", (*int)(nil), " 0x00"}, {"%p", nil, "%!p(<nil>)"}, // nil on its own has no type ... {"%#p", nil, "%!p(<nil>)"}, // ... and hence is not a pointer type. {"%v", (*int)(nil), "<nil>"}, {"%#v", (*int)(nil), "(*int)(nil)"}, {"%8.2v", (*int)(nil), " <nil>"}, {"%p", &intVar, "0xPTR"}, //%p 0xc00000a0a8 0xc00000a0a8 {"%#p", &intVar, "PTR"}, // pointers with specified base {"%b", &intVar, "PTR_b"}, {"%d", &intVar, "PTR_d"}, {"%o", &intVar, "PTR_o"}, {"%x", &intVar, "PTR_x"}, {"%X", &intVar, "PTR_X"}, {"%-20.16p", &intVar, "0xPTR "}, // %p on non-pointers {"%p", make(chan int), "0xPTR"}, {"%p", make(map[int]int), "0xPTR"}, {"%p", func() {}, "0xPTR"}, {"%p", 27, "%!p(int=27)"}, // not a pointer at all // %v on pointers {"%v", &intVar, "0xPTR"}, {"%#v", &intVar, "(*int)(0xPTR)"}, {"%-20.16v", &intVar, "0xPTR "}, // erroneous things {"", nil, "%!(EXTRA <nil>)"}, {"", 2, "%!(EXTRA int=2)"}, {"no args", "hello", "no args%!(EXTRA string=hello)"}, {"%s %", "hello", "hello %!(NOVERB)"}, {"%s %.2", "hello", "hello %!(NOVERB)"}, {"%017091901790959340919092959340919017929593813360", 0, "%!(NOVERB)%!(EXTRA int=0)"}, {"%184467440737095516170v", 0, "%!(NOVERB)%!(EXTRA int=0)"}, // Extra argument errors should format without flags set. {"%010.2", "12345", "%!(NOVERB)%!(EXTRA string=12345)"}, } format := "%-10v %3v %2v \n" for _, tt := range fmtTests { c:= fmt.Sprintf(tt.fmt, tt.val) //Sprintf返回接收 fmt.Printf(format,tt.fmt,tt.val,c) } } func Utest(){ var fmtTests = []struct { fmt string val interface{} out string }{ // unicode format {"%U", 0, "U+0000"}, {"%U", -1, "U+FFFFFFFFFFFFFFFF"}, {"%U", '\n', `U+000A`}, {"%#U", '\n', `U+000A`}, {"%+U", 'x', `U+0078`}, // %+U中的+号应该不会有结果 {"%# U", 'x', `U+0078 'x'`}, // %# U里面的空格应该不会有结果 {"%U", '\u263a', `U+263A`}, {"%#U", '\u263a', `U+263A ''`}, {"%U", '\U0001D6C2', `U+1D6C2`}, {"%#U", '\U0001D6C2', `U+1D6C2 '𝛂'`}, {"%#14.6U", '', " U+002318 '⌘'"}, //默认右对齐 {"%#-14.6U", '', "U+002318 '⌘' "}, //-左对齐,.6表示输出6位数字 002318 {"%#014.6U", '', " U+002318 '⌘'"}, {"%#-014.6U", '', "U+002318 '⌘' "}, //表示左对齐,14个字符,.6表示unicode字符输出6位(打印4个非0数字) //fmt.Printf("%.6U\n",'⌘') //U+002318 {"%#.2U", 'x', `U+0078 'x'`}, //实际没有作用,只有.6有作用 } format := "%-10v %3v %2v \n" for _, tt := range fmtTests { c:= fmt.Sprintf(tt.fmt, tt.val) //Sprintf返回接收 fmt.Printf(format,tt.fmt,tt.val,c) } //比较一下他们的输出 //输出unicode码和原始字符 fmt.Printf("%#-14.6U\n",'') //U+002318 '⌘' //去掉.6,不输出00 fmt.Printf("%#-14U\n",'') //U+2318 '⌘' //不输出原始字符,输出unicode code point ,取6个字符,不算U+ fmt.Printf("%.6U\n",'') //U+002318 fmt.Printf("%#.3U\n",'x') //U+0078 'x' fmt.Printf("%#.2U\n",'x') //U+0078 'x' fmt.Printf("%#.6U\n",'x') //U+000078 'x' //fmt.Printf("%#-14.6U","⌘") //如果是双引号就得不到想要的结果,因为不rune } func floattest(){ var fmtTests = []struct { fmt string val interface{} out string }{ // floats {"%+.3e", 0.0, "+0.000e+00"},
{"%+.2e", 0.0, "+0.00e+00"} //fmt.Printf("%+.2e\n", 0.0)  //+0.00e+00 {
"%+.3e", 1.0, "+1.000e+00"},
     {"%+.2e", 1.0, "+1.00e+00"} //fmt.Printf("%+.2e\n", 1.0)  //+0.00e+00 {
"%+.3x", 0.0, "+0x0.000p+00"}, {"%+.3x", 1.0, "+0x1.000p+00"}, {"%+.3f", -1.0, "-1.000"}, {"%+.3F", -1.0, "-1.000"}, {"%+.3F", float32(-1.0), "-1.000"}, {"%+07.2f", 1.0, "+001.00"}, {"%+07.2f", -1.0, "-001.00"}, {"%-07.2f", 1.0, "1.00 "}, {"%-07.2f", -1.0, "-1.00 "}, {"%+-07.2f", 1.0, "+1.00 "}, {"%+-07.2f", -1.0, "-1.00 "}, {"%-+07.2f", 1.0, "+1.00 "}, {"%-+07.2f", -1.0, "-1.00 "}, {"%+10.2f", +1.0, " +1.00"}, {"%+10.2f", -1.0, " -1.00"}, {"% .3E", -1.0, "-1.000E+00"}, {"% .3e", 1.0, " 1.000e+00"}, {"% .3X", -1.0, "-0X1.000P+00"}, {"% .3x", 1.0, " 0x1.000p+00"}, {"%+.3g", 0.0, "+0"}, {"%+.3g", 1.0, "+1"}, {"%+.3g", -1.0, "-1"}, {"% .3g", -1.0, "-1"}, {"% .3g", 1.0, " 1"}, {"%b", float32(1.0), "8388608p-23"}, {"%b", 1.0, "4503599627370496p-52"}, // Test sharp flag used with floats. {"%#g", 1e-323, "1.00000e-323"}, {"%#g", -1.0, "-1.00000"}, {"%#g", 1.1, "1.10000"}, {"%#g", 123456.0, "123456."}, {"%#g", 1234567.0, "1.234567e+06"}, {"%#g", 1230000.0, "1.23000e+06"}, {"%#g", 1000000.0, "1.00000e+06"}, {"%#.0f", 1.0, "1."}, {"%#.0e", 1.0, "1.e+00"}, {"%#.0x", 1.0, "0x1.p+00"}, {"%#.0g", 1.0, "1."}, {"%#.0g", 1100000.0, "1.e+06"}, {"%#.4f", 1.0, "1.0000"}, {"%#.4e", 1.0, "1.0000e+00"}, {"%#.4x", 1.0, "0x1.0000p+00"}, {"%#.4g", 1.0, "1.000"}, {"%#.4g", 100000.0, "1.000e+05"}, {"%#.4g", 1.234, "1.234"}, {"%#.4g", 0.1234, "0.1234"}, {"%#.4g", 1.23, "1.230"}, {"%#.4g", 0.123, "0.1230"}, {"%#.4g", 1.2, "1.200"}, {"%#.4g", 0.12, "0.1200"}, {"%#.4g", 10.2, "10.20"}, {"%#.4g", 0.0, "0.000"}, {"%#.4g", 0.012, "0.01200"}, {"%#.0f", 123.0, "123."}, {"%#.0e", 123.0, "1.e+02"}, {"%#.0x", 123.0, "0x1.p+07"}, {"%#.0g", 123.0, "1.e+02"}, {"%#.4f", 123.0, "123.0000"}, {"%#.4e", 123.0, "1.2300e+02"}, {"%#.4x", 123.0, "0x1.ec00p+06"}, {"%#.4g", 123.0, "123.0"}, {"%#.4g", 123000.0, "1.230e+05"}, {"%#9.4g", 1.0, " 1.000"}, {"%#b", 1.0, "4503599627370496p-52"}, // Precision has no effect for binary float format. {"%.4b", float32(1.0), "8388608p-23"}, {"%.4b", -1.0, "-4503599627370496p-52"}, // complex values {"%.f", 0i, "(0+0i)"}, {"% .f", 0i, "( 0+0i)"}, {"%+.f", 0i, "(+0+0i)"}, {"% +.f", 0i, "(+0+0i)"}, {"%+.3e", 0i, "(+0.000e+00+0.000e+00i)"}, {"%+.3x", 0i, "(+0x0.000p+00+0x0.000p+00i)"}, {"%+.3f", 0i, "(+0.000+0.000i)"}, {"%+.3g", 0i, "(+0+0i)"}, {"%+.3e", 1 + 2i, "(+1.000e+00+2.000e+00i)"}, {"%+.3x", 1 + 2i, "(+0x1.000p+00+0x1.000p+01i)"}, {"%+.3f", 1 + 2i, "(+1.000+2.000i)"}, {"%+.3g", 1 + 2i, "(+1+2i)"}, {"%.3e", 0i, "(0.000e+00+0.000e+00i)"}, {"%.3x", 0i, "(0x0.000p+00+0x0.000p+00i)"}, {"%.3f", 0i, "(0.000+0.000i)"}, {"%.3F", 0i, "(0.000+0.000i)"}, {"%.3F", complex64(0i), "(0.000+0.000i)"}, {"%.3g", 0i, "(0+0i)"}, {"%.3e", 1 + 2i, "(1.000e+00+2.000e+00i)"}, {"%.3x", 1 + 2i, "(0x1.000p+00+0x1.000p+01i)"}, {"%.3f", 1 + 2i, "(1.000+2.000i)"}, {"%.3g", 1 + 2i, "(1+2i)"}, {"%.3e", -1 - 2i, "(-1.000e+00-2.000e+00i)"}, {"%.3x", -1 - 2i, "(-0x1.000p+00-0x1.000p+01i)"}, {"%.3f", -1 - 2i, "(-1.000-2.000i)"}, {"%.3g", -1 - 2i, "(-1-2i)"}, {"% .3E", -1 - 2i, "(-1.000E+00-2.000E+00i)"}, {"% .3X", -1 - 2i, "(-0X1.000P+00-0X1.000P+01i)"}, {"%+.3g", 1 + 2i, "(+1+2i)"}, {"%+.3g", complex64(1 + 2i), "(+1+2i)"}, {"%#g", 1 + 2i, "(1.00000+2.00000i)"}, {"%#g", 123456 + 789012i, "(123456.+789012.i)"}, {"%#g", 1e-10i, "(0.00000+1.00000e-10i)"}, {"%#g", -1e10 - 1.11e100i, "(-1.00000e+10-1.11000e+100i)"}, {"%#.0f", 1.23 + 1.0i, "(1.+1.i)"}, {"%#.0e", 1.23 + 1.0i, "(1.e+00+1.e+00i)"}, {"%#.0x", 1.23 + 1.0i, "(0x1.p+00+0x1.p+00i)"}, {"%#.0g", 1.23 + 1.0i, "(1.+1.i)"}, {"%#.0g", 0 + 100000i, "(0.+1.e+05i)"}, {"%#.0g", 1230000 + 0i, "(1.e+06+0.i)"}, {"%#.4f", 1 + 1.23i, "(1.0000+1.2300i)"}, {"%#.4e", 123 + 1i, "(1.2300e+02+1.0000e+00i)"}, {"%#.4x", 123 + 1i, "(0x1.ec00p+06+0x1.0000p+00i)"}, {"%#.4g", 123 + 1.23i, "(123.0+1.230i)"}, {"%#12.5g", 0 + 100000i, "( 0.0000 +1.0000e+05i)"}, {"%#12.5g", 1230000 - 0i, "( 1.2300e+06 +0.0000i)"}, {"%b", 1 + 2i, "(4503599627370496p-52+4503599627370496p-51i)"}, {"%b", complex64(1 + 2i), "(8388608p-23+8388608p-22i)"}, } format := "%-10v %3v %2v \n" for _, tt := range fmtTests { c:= fmt.Sprintf(tt.fmt, tt.val) //Sprintf返回接收 fmt.Printf(format,tt.fmt,tt.val,c) } } //%b输出二进制 func bytetest(){ var fmtTests = []struct { fmt string val interface{} out string }{ // byte arrays and slices with %b,%c,%d,%o,%U and %v {"%b", [3]byte{65, 66, 67}, "[1000001 1000010 1000011]"}, //输出二进制数 {"%c",    [3]byte{65, 66, 67}, "[A B C]"}, //输出unicode字符 {"%d",    [3]byte{65, 66, 67}, "[65 66 67]"}, //输出十进制 {"%o",    [3]byte{65, 66, 67}, "[101 102 103]"},//输出8进制 {"%U",    [3]byte{65, 66, 67}, "[U+0041 U+0042 U+0043]"}, //输出 {"%v",    [3]byte{65, 66, 67}, "[65 66 67]"}, //显示原始字符 {"%v",    [1]byte{123},      "[123]"}, {"%012v", []byte{},        "[]"}, {"%#012v", []byte{},         "[]byte{}"}, {"%6v", []byte{1, 11, 111}, "[ 1 11 111]"}, {"%06v", []byte{1, 11, 111}, "[000001 000011 000111]"}, //输出6位一组,字符不够6位填充0 {"%-6v", []byte{1, 11, 111}, "[1 11 111 ]"}, //-表示左对齐 {"%-06v", []byte{1, 11, 111}, "[1 11 111 ]"}, {"%#v", []byte{1, 11, 111}, "[]byte{0x1, 0xb, 0x6f}"}, {"%#6v", []byte{1, 11, 111}, "[]byte{ 0x1, 0xb, 0x6f}"}, //输出16进制,默认右对齐,每个字节6位输出 {"%#06v", []byte{1, 11, 111}, "[]byte{0x000001, 0x00000b, 0x00006f}"}, {"%#-6v", []byte{1, 11, 111}, "[]byte{0x1 , 0xb , 0x6f }"}, {"%#-06v", []byte{1, 11, 111}, "[]byte{0x1 , 0xb , 0x6f }"}, // f.space should and f.plus should not have an effect with %v. {"% v", []byte{1, 11, 111}, "[ 1 11 111]"}, {"%+v", [3]byte{1, 11, 111}, "[1 11 111]"}, {"%# -6v", []byte{1, 11, 111}, "[]byte{ 0x1 , 0xb , 0x6f }"}, {"%#+-6v", [3]byte{1, 11, 111}, "[3]uint8{0x1 , 0xb , 0x6f }"}, // f.space and f.plus should have an effect with %d. {"% d", []byte{1, 11, 111}, "[ 1 11 111]"}, {"%+d", [3]byte{1, 11, 111}, "[+1 +11 +111]"}, {"%# -6d", []byte{1, 11, 111}, "[ 1 11 111 ]"}, {"%#+-6d", [3]byte{1, 11, 111}, "[+1 +11 +111 ]"}, // floates with %v {"%v", 1.2345678, "1.2345678"}, {"%v", float32(1.2345678), "1.2345678"}, // complexes with %v {"%v", 1 + 2i, "(1+2i)"}, {"%v", complex64(1 + 2i), "(1+2i)"}, // structs {"%v", A{1, 2, "a", []int{1, 2}}, `{1 2 a [1 2]}`}, {"%+v", A{1, 2, "a", []int{1, 2}}, `{i:1 j:2 s:a x:[1 2]}`}, // +v on structs with Stringable items {"%+v", B{1, 2}, `{I:<1> j:2}`}, {"%+v", C{1, B{2, 3}}, `{i:1 B:{I:<2> j:3}}`}, // other formats on Stringable items {"%s", I(23), `<23>`}, {"%q", I(23), `"<23>"`}, {"%x", I(23), `3c32333e`}, {"%#x", I(23), `0x3c32333e`}, {"%# x", I(23), `0x3c 0x32 0x33 0x3e`}, // Stringer applies only to string formats. {"%d", I(23), `23`}, // Stringer applies to the extracted value. {"%s", reflect.ValueOf(I(23)), `<23>`}, // go syntax {"%#v", A{1, 2, "a", []int{1, 2}}, `fmt_test.A{i:1, j:0x2, s:"a", x:[]int{1, 2}}`}, {"%#v", new(byte), "(*uint8)(0xPTR)"}, {"%#v", TestFmtInterface, "(func(*testing.T))(0xPTR)"}, {"%#v", make(chan int), "(chan int)(0xPTR)"}, {"%#v", uint64(1<<64 - 1), "0xffffffffffffffff"}, {"%#v", 1000000000, "1000000000"}, {"%#v", map[string]int{"a": 1}, `map[string]int{"a":1}`}, {"%#v", map[string]B{"a": {1, 2}}, `map[string]fmt_test.B{"a":fmt_test.B{I:1, j:2}}`}, {"%#v", []string{"a", "b"}, `[]string{"a", "b"}`}, {"%#v", SI{}, `fmt_test.SI{I:interface {}(nil)}`}, {"%#v", []int(nil), `[]int(nil)`}, {"%#v", []int{}, `[]int{}`}, {"%#v", array, `[5]int{1, 2, 3, 4, 5}`}, {"%#v", &array, `&[5]int{1, 2, 3, 4, 5}`}, {"%#v", iarray, `[4]interface {}{1, "hello", 2.5, interface {}(nil)}`}, {"%#v", &iarray, `&[4]interface {}{1, "hello", 2.5, interface {}(nil)}`}, {"%#v", map[int]byte(nil), `map[int]uint8(nil)`}, {"%#v", map[int]byte{}, `map[int]uint8{}`}, {"%#v", "foo", `"foo"`}, {"%#v", barray, `[5]fmt_test.renamedUint8{0x1, 0x2, 0x3, 0x4, 0x5}`}, {"%#v", bslice, `[]fmt_test.renamedUint8{0x1, 0x2, 0x3, 0x4, 0x5}`}, {"%#v", []int32(nil), "[]int32(nil)"}, {"%#v", 1.2345678, "1.2345678"}, {"%#v", float32(1.2345678), "1.2345678"}, // Whole number floats are printed without decimals. See Issue 27634. {"%#v", 1.0, "1"}, {"%#v", 1000000.0, "1e+06"}, {"%#v", float32(1.0), "1"}, {"%#v", float32(1000000.0), "1e+06"}, // Only print []byte and []uint8 as type []byte if they appear at the top level. {"%#v", []byte(nil), "[]byte(nil)"}, {"%#v", []uint8(nil), "[]byte(nil)"}, {"%#v", []byte{}, "[]byte{}"}, {"%#v", []uint8{}, "[]byte{}"}, {"%#v", reflect.ValueOf([]byte{}), "[]uint8{}"}, {"%#v", reflect.ValueOf([]uint8{}), "[]uint8{}"}, {"%#v", &[]byte{}, "&[]uint8{}"}, {"%#v", &[]byte{}, "&[]uint8{}"}, {"%#v", [3]byte{}, "[3]uint8{0x0, 0x0, 0x0}"}, {"%#v", [3]uint8{}, "[3]uint8{0x0, 0x0, 0x0}"}, // slices with other formats {"%#x", []int{1, 2, 15}, `[0x1 0x2 0xf]`}, {"%x", []int{1, 2, 15}, `[1 2 f]`}, {"%d",    []int{1, 2, 15}, `[1 2 15]`}, {"%d",    []byte{1, 2, 15}, `[1 2 15]`}, {"%q",    []string{"a", "b"}, `["a" "b"]`}, {"% 02x", []byte{1}, "01"}, {"% 02x", []byte{1, 2, 3}, "01 02 03"}, // Padding with byte slices. 如果想测试,加下||,在两边,这样就比较明显看到效果 {"|%2x|", []byte{}, " "}, //| | {"%#2x", []byte{}, " "}, {"% 02x", []byte{}, "00"}, {"%# 02x", []byte{}, "00"}, {"%-2x", []byte{}, " "}, {"%-02x", []byte{}, " "}, {"%8x", []byte{0xab}, " ab"}, {"% 8x", []byte{0xab}, " ab"}, {"%#8x", []byte{0xab}, " 0xab"}, {"%# 8x", []byte{0xab}, " 0xab"}, {"%08x", []byte{0xab}, "000000ab"}, {"% 08x", []byte{0xab}, "000000ab"}, {"%#08x", []byte{0xab}, "00000xab"}, {"%# 08x", []byte{0xab}, "00000xab"}, {"%10x", []byte{0xab, 0xcd}, " abcd"}, {"% 10x", []byte{0xab, 0xcd}, " ab cd"}, {"%#10x", []byte{0xab, 0xcd}, " 0xabcd"}, {"%# 10x", []byte{0xab, 0xcd}, " 0xab 0xcd"}, {"%010x", []byte{0xab, 0xcd}, "000000abcd"}, {"% 010x", []byte{0xab, 0xcd}, "00000ab cd"}, {"%#010x", []byte{0xab, 0xcd}, "00000xabcd"}, {"%# 010x", []byte{0xab, 0xcd}, "00xab 0xcd"}, {"%-10X", []byte{0xab}, "AB "}, {"% -010X", []byte{0xab}, "AB "}, {"%#-10X", []byte{0xab, 0xcd}, "0XABCD "}, {"%# -010X", []byte{0xab, 0xcd}, "0XAB 0XCD "}, // Same for strings {"%2x", "", " "}, {"%#2x", "", " "}, {"% 02x", "", "00"}, {"%# 02x", "", "00"}, {"%-2x", "", " "}, {"%-02x", "", " "}, {"%8x", "\xab", " ab"}, {"% 8x", "\xab", " ab"}, {"%#8x", "\xab", " 0xab"}, {"%# 8x", "\xab", " 0xab"}, {"%08x", "\xab", "000000ab"}, {"% 08x", "\xab", "000000ab"}, {"%#08x", "\xab", "00000xab"}, {"%# 08x", "\xab", "00000xab"}, {"%10x", "\xab\xcd", " abcd"}, {"% 10x", "\xab\xcd", " ab cd"}, {"%#10x", "\xab\xcd", " 0xabcd"}, {"%# 10x", "\xab\xcd", " 0xab 0xcd"}, {"%010x", "\xab\xcd", "000000abcd"}, {"% 010x", "\xab\xcd", "00000ab cd"}, {"%#010x", "\xab\xcd", "00000xabcd"}, {"%# 010x", "\xab\xcd", "00xab 0xcd"}, {"%-10X", "\xab", "AB "}, {"% -010X", "\xab", "AB "}, {"%#-10X", "\xab\xcd", "0XABCD "}, {"%# -010X", "\xab\xcd", "0XAB 0XCD "}, } format := "%-10v %3v %2v \n" for _, tt := range fmtTests { c:= fmt.Sprintf(tt.fmt, tt.val) //Sprintf返回接收 fmt.Printf(format,tt.fmt,tt.val,c) } } func main(){ Utest() //testpoint() //widthtest() //escapedstrings() //Runestest() //stringformatting百分号x() //vtest() //数组int() }

 

posted @ 2025-12-19 18:10  jinzi  阅读(0)  评论(0)    收藏  举报