Go程式設計基礎—格式化
阿新 • • 發佈:2019-01-06
Golang格式化小結
Golang的格式化使用了與c、python等語言類似的風格,但是更加豐富和通用。格式化函式在fmt包中,如:fmt.Printf,fmt.Fprintf,fmt.Sprintf,fmt.Println等等。其中Print,Fprint,Sprint都有一個對應的f函式版本和ln版本(f指format,ln指line)。
ln版本(Println,Fprintln,Sprintln),這些函式不接受格式字串,每個引數都會使用一個預設的格式字串。而且ln版本還會在引數之間插入一個空格,並且在末尾新增一個換行符。而以ln結尾的格式化函式,則遵循Println的方式。Print版本只有當兩邊的運算元都不是字串的時候,才會新增一個空格。
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佔位符
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,這三種列印形式都可以指定列印的寬度、控制列印的精度。
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