Golang格式化小結

2022-03-05 14:09:13 字數 3922 閱讀 9066

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的格式化標準。

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"。

格式化轉換列表如下:

寬度與精度的控制格式以unicdoe碼點為單位,這和c的printf不同,它以位元組數為單位。兩者或者其中之一均可以用'*'表示,此時它們的值會從下乙個運算元中獲取,該運算元型別必須為int。

格式說明

%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,這三種列印形式都可以指定列印的寬度、控制列印的精度。

格式說明

%e,%e

科學計數法,以10為底

%f,%f

普通小數格式

%g根據情況選擇 %e 或 %f 以產生更緊湊的(無末尾的 0)輸出

%g根據情況選擇 %e 或 %f 以產生更緊湊的(無末尾的 0)輸出

for x := 0; x < 12; 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),精度為數字的總和。

fmt.printf("%d %[1]o %#[1]o\n",0666)
通常printf格式化引數包含多個%引數時,會包含同數量的運算元,%後的[1]告訴printf函式再次使用第乙個運算元

for i, r := range "hello, 世界" 

//output:

// 0 'h' 72

// 1 'e' 101

// 2 'l' 108

// 3 'l' 108

// 4 'o' 111

// 5 ',' 44

// 6 ' ' 32

// 7 '世' 19990

// 10 '界' 30028

golang時間格式化

golang時間處理 相關包 time 當前時間戳 fmt.println time.now unix 1389058332當前格式化時間 fmt.println time.now format 2006 01 02 15 04 05 這是個奇葩,必須是這個時間點,據說是go誕生之日,記憶方法 6 ...

golang之路 時間格式化

有人問了問go的時間格式化問題,於是乎自己嘗試了下,發現巨坑爹,不按常理出牌啊 format的竟然模版必須如下面的每個數字,t time.unix 1362984425,0 nt t.format 2006 01 02 15 04 05 fmt.println nt 附上現有的go格式 const ...

golang 時間格式化總結

通過date.now方法獲取的是基於當地時區的時間 now date.now 結果是2019 06 27 10 28 31.282649389 0800 cst m 0.000347190,注意是帶了當地時區 08的 通過time.parse將字串轉化為時間型別,是utc時間 before,time...