Golang格式化小結


Golang的格式化使用了與c、python等語言類似的風格,但是更加豐富和通用。格式化函數在fmt包中,如:fmt.Printf,fmt.Fprintf,fmt.Sprintf,fmt.Println等等。其中Print,Fprint,Sprint都有一個對應d的ln函數版本和print版本(f指format,ln指line)。

Print版本 f版本 ln版本 輸出
Print 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的格式化標准。

1.格式字符串

Golang的格式化字符串由普通字符和占位符組成,如:

  "abcd%+ #8.3[3]vefg"

其中abcd和efg是普通字符,其他部分是占位符。占位符以%開頭,以動詞結尾,格式如下:

%[旗標][寬度][.精度][arg索引]動詞

其中,方括號中的內容是可缺省的。

1.1旗標

旗標有以下幾種:

+:  對於數值類型總是輸出正負號;對於%q(%+q)保證只輸出ASCII編碼的字符

-:  在右邊進行寬度填充,而不是默認的左邊。

空格:  對於數值類型的正數,保留一個空白的符號位(其它用法在動詞部分說明)。

0:  用 0 進行寬度填充而不用空格,對於數值類型,符號將被移到所有 0 的前面。

#:  備用格式:為八進制添加前綴0(%#o);為十六進制添加前綴0x(%#x)或者0X(%#X);
    為%p(%#p)去掉前綴0x;。

其中 "0" 和 "-" 不能同時使用,優先使用 "-" 而忽略 "0"。

格式化轉換列表如下:

1.2寬度-精度

寬度與精度的控制格式以Unicdoe碼點為單位,這和C的printf不同,它以字節數為單位。兩者或者其中之一均可以用'*'表示,此時它們的值會從下一個操作數中獲取,該操作數類型必須為int。

  • 對數值而言,寬度為該數值占用區域的最小寬度;精度為小數點后的位數。但是對%g(%G),精度為數字的總和。
  • 對於大多數數值而言,寬度為輸出的最小字符串,如果必要則會為已格式化的形式添加空格。
  • 對於字符串,精度為輸出的最大字符數,必要時會截斷字符串。

1.3占位符

格式 說明
%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

1.4 格式化整數

	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

1.5 浮點數

浮點數格式化,可以使用%f、%g、%e,這三種打印形式都可以指定打印的寬度、控制打印的精度。

格式 說明
%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),精度為數字的總和。

1.6 重用參數

fmt.Printf("%d %[1]o %#[1]o\n",0666)

通常Printf格式化參數包含多個%參數時,會包含同數量的操作數,%后的[1]告訴Printf函數再次使用第一個操作數

1.7 字符串

    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

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM