Golang的格式化使用了與c、python等語言相似的風格,可是更加豐富和通用。格式化函數在fmt包中,如:fmt.Printf,fmt.Fprintf,fmt.Sprintf,fmt.Println等等。其中Print,Fprint,Sprint都有一個對應d的ln函數版本和print版本(f指format,ln指line)。html
Print版本 | f版本 | ln版本 | 輸出 |
---|---|---|---|
Printf | Println | 結果寫到標準輸出 | |
Sprint | Sprintf | Sprintln | 結果會以字符串形式返回 |
Fprint | Fprintf | Fprintln | 輸出結果會被寫入到第一個參數提供的輸出中 |
ln版本(Println,Fprintln,Sprintln),這些函數不接受格式字符串,每一個參數都會使用一個缺省的格式字符串。並且ln版本還會在參數之間插入一個空格,而且在末尾添加一個換行符。而以ln結尾的格式化函數,則遵循Println的方式。Print版本只有當兩邊的操做數都不是字符串的時候,纔會添加一個空格。f版本格式化函數須要指定格式化字符串參數,指定後續參數被如何格式化。各個參數的格式取決於"轉換字符"(conversion character),形式爲:百分號+字母,如,%d。按照慣例,以字母f結尾的格式化函數,如:log.Printf、fmt.Errorf都採用fmt.Printf的格式化標準。python
Golang的格式化字符串由普通字符和佔位符組成,如:golang
"abcd%+ #8.3[3]vefg"
其中abcd和efg是普通字符,其餘部分是佔位符。佔位符以%開頭,以動詞結尾,格式以下:函數
%[旗標][寬度][.精度][arg索引]動詞
其中,方括號中的內容是可缺省的。編碼
旗標有如下幾種:指針
+: 對於數值類型老是輸出正負號;對於%q(%+q)保證只輸出ASCII編碼的字符 -: 在右邊進行寬度填充,而不是默認的左邊。 空格: 對於數值類型的正數,保留一個空白的符號位(其它用法在動詞部分說明)。 0: 用 0 進行寬度填充而不用空格,對於數值類型,符號將被移到全部 0 的前面。 #: 備用格式:爲八進制添加前綴0(%#o);爲十六進制添加前綴0x(%#x)或者0X(%#X); 爲%p(%#p)去掉前綴0x;。 其中 "0" 和 "-" 不能同時使用,優先使用 "-" 而忽略 "0"。
格式化轉換列表以下:code
寬度與精度的控制格式以Unicdoe碼點爲單位,這和C的printf不一樣,它以字節數爲單位。二者或者其中之一都可以用'*'表示,此時它們的值會從下一個操做數中獲取,該操做數類型必須爲int。orm
格式 | 說明 |
---|---|
%d | 十進制數 |
%b,%o,%x | 二進制、八進制、十六進制整數 |
%#b,%#o,%#x | 二進制、八進制、十六進制整數,並顯示相應前綴 |
%f,%g,%e | 浮點數 |
%t | 布爾值: true或者false |
%c | 相應Unicode碼點表示的字符 |
%s | 字符串 |
%U | 顯示Unicode碼點 |
%q | 帶雙引號的字符串"abc123"或者帶單引號的字符'a','b' |
%v | 變量的天然形式(natural format) |
%#v | 使用Go語言類是的語法打印變量值 |
%T | 變量的類型 |
%% | 字面上的百分號標誌(無操做數) |
%p | 十六進制表示指針地址,並使用前綴0x |
num := 022 fmt.Printf("%d\n", num) //十進制 fmt.Printf("%b\n", num) //二進制 fmt.Printf("%o\t %#o \n", num, num) //八進制,顯示0前綴 fmt.Printf("%x\t %#x \t%#X\n", num, num, num) //十六進制,顯示0x,0X前綴 // output: // 18 // 10010 // 22 022 // 12 0x12 0X12
浮點數格式化,可使用%f、%g、%e,這三種打印形式均可以指定打印的寬度、控制打印的精度。htm
格式 | 說明 |
---|---|
%e,%E | 科學計數法,以10爲底 |
%f,%F | 普通小數格式 |
%g | 根據狀況選擇 %e 或 %f 以產生更緊湊的(無末尾的 0)輸出 |
%G | 根據狀況選擇 %E 或 %F 以產生更緊湊的(無末尾的 0)輸出 |
for x := 0; x < 12; x++ { fmt.Printf("x = %2d e^x = %9.3f\t(%9.3[2]e)\t(%9.3[2]g)\n", x, math.Exp(float64(x))) } // output: %9.3f %9.3[2]e %9.3[2]g // x = 0 e^x = 1.000 (1.000e+00) ( 1) // x = 1 e^x = 2.718 (2.718e+00) ( 2.72) // x = 2 e^x = 7.389 (7.389e+00) ( 7.39) // x = 3 e^x = 20.086 (2.009e+01) ( 20.1) // x = 4 e^x = 54.598 (5.460e+01) ( 54.6) // x = 5 e^x = 148.413 (1.484e+02) ( 148) // x = 6 e^x = 403.429 (4.034e+02) ( 403) // x = 7 e^x = 1096.633 (1.097e+03) ( 1.1e+03) // x = 8 e^x = 2980.958 (2.981e+03) ( 2.98e+03) // x = 9 e^x = 8103.084 (8.103e+03) ( 8.1e+03) // x = 10 e^x = 22026.466 (2.203e+04) ( 2.2e+04) // x = 11 e^x = 59874.142 (5.987e+04) ( 5.99e+04)
注: %9.3f、%9.3[2]e或%9.3[2]g中9.3表示:寬度爲9,小數點後保留3位,[2]表示重用Printf的第二個參數。寬度爲該數值佔用區域的最小寬度;精度爲小數點後的位數。可是%g(%G),精度爲數字的總和。blog
fmt.Printf("%d %[1]o %#[1]o\n",0666)
一般Printf格式化參數包含多個%參數時,會包含同數量的操做數,%後的[1]告訴Printf函數再次使用第一個操做數
for i, r := range "Hello, 世界" { fmt.Printf("%d\t%q\t%d\n", i, r, r) } //output: // 0 'H' 72 // 1 'e' 101 // 2 'l' 108 // 3 'l' 108 // 4 'o' 111 // 5 ',' 44 // 6 ' ' 32 // 7 '世' 19990 // 10 '界' 30028