這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Fmt包import "fmt"簡介 ▾Package fmt包含有格式化I/O函數,類似於C語言的printf和scanf。格式字串的規則來源於C但更簡單一些。輸出格式:一般:%v 基本格式的值。當輸出結構體時,擴充標誌(%+v)新增成員的名字。the value in a default format. when printing structs, the plus flag (%+v) adds field names%#v 值的Go文法表示。%T 值的類型的Go文法表示。%% 百分比符號。布爾型:%t 值的true或false整型:%b 二進位表示%c 數值對應的Unicode編碼字元%d 十進位表示%o 八進位表示%q 單引號%x 十六進位表示,使用a-f%X 十六進位表示,使用A-F%U Unicode格式: U+1234,等價於"U+%04X"浮點數:%b 無小數部分、兩位指數的科學計數法,和strconv.FormatFloat的'b'轉換格式一致。舉例:-123456p-78%e 科學計數法,舉例:-1234.456e+78%E 科學計數法,舉例:-1234.456E+78%f 有小數部分,但無指數部分,舉例:123.456%g 根據實際情況採用%e或%f格式(以獲得更簡潔的輸出)%G 根據實際情況採用%E或%f格式(以獲得更簡潔的輸出)字串和byte切片類型:%s 直接輸出字串或者[]byte%q 雙引號括起來的字串%x 每個位元組用兩字元十六進位數表示(使用小寫a-f)%X 每個位元組用兩字元十六進位數表示(使用大寫A-F)指標:%p 0x開頭的十六進位數表示木有'u'標誌。如果是無類型整數,自然會列印無類型格式。類似的,沒有必要去區分運算元的大小(int8, int64)。寬度和精度格式化控制是指的Unicode編碼字元的數量(不同於C的printf,它的這兩個因子指的是位元組的數量。)兩者均可以使用'*'號取代(任一個或兩個都),此時它們的值將被緊接著的參數控制,這個運算元必須是整型。對於數字,寬度設定總長度,精度設定小數部分長度。例如,格式%6.2f 輸出123.45。對於字串,寬度是輸出字元數目的最低數量,如果不足會用空格填充。精度是輸出字元數目的最大數量,超過則會截斷。其它符號:+ 總是輸出數值的加號或減號;對%q(%+q)將保證純ASCII碼輸出- 用空格在右側填充空缺而不是預設的左側。# 切換格式:在八進位前加0(%#o),十六進位前加0x(%#x)或0X(%#X);廢除指標的0x(%#p); 對%q (%#q)如果可能的話輸出一個無修飾的字串; 對%U(%#U)如果對應數值是可列印字元輸出該字元。' ' 對數字(% d)空格會留一個空格在數字前並忽略數位加號或減號; 對切片和字串(% x, % X)會以16進位輸出。0 用前置0代替空格填補空缺。每一個類似Printf的函數,都會有一個同樣的Print函數,此函數不需要format字串,等價於對每一個參數設定為%v。另一個變體Println會在參數之間加上空格並在輸出結束後換行。如果參數是一個介面值,將使用內在的具體實現的值,而不是介面本身,%v參數不會被使用。如下:var i interface{} = 23fmt.Printf("%v\n", i)將輸出23。如果參數實現了Formatter介面,該介面可用來更好的控制格式化。如果格式(標誌對Println等是隱含的%v)是專用於字串的(%s %q %v %x %X),還提供了如下兩個規則:1. 如果一個參數實現了error介面,Error方法會用來將目標轉化為字串,隨後將被按給出的要求格式化。2. 如果參數提供了String方法,這個方法將被用來將目標轉換為字串,然後將按給出的格式標誌格式化。為了避免有可能的遞迴迴圈,例如:type X stringfunc (x X) String() string { return Sprintf("<%s>", x) }會在遞迴迴圈前轉換值:func (x X) String() string { return Sprintf("<%s>", string(x)) }錯誤的格式:如果提供了一個錯誤的格式標誌,例如給一個字串提供了%d標誌,產生的字串將包含對該問題的描述,如下面的例子:錯誤或未知的格式標誌: %!verb(type=value) Printf("%d", hi): %!d(string=hi)太多參數: %!(EXTRA type=value) Printf("hi", "guys"): hi%!(EXTRA string=guys)缺少參數: %!verb(MISSING) Printf("hi%d"): hi %!d(MISSING)使用非整數提供寬度和精度: %!(BADWIDTH) or %!(BADPREC) Printf("%*s", 4.5, "hi"): %!(BADWIDTH)hi Printf("%.*s", 4.5, "hi"): %!(BADPREC)hi所有的錯誤都使用"%!"起始,(緊隨單字元的格式標誌)以括弧包圍的錯誤描述結束。輸入一系列類似的函數讀取格式化的文本,產生值。Scan,Scanf和Scanln從os.Stdin讀取;Fscan,Fscanf和Fscanln 從特定的io.Reader讀取;Sscan,Sscanf和Sscanln 從字串讀取;Scanln,Fscanln和Sscanln在換行時結束讀取,並要求資料連續出現;Scanf,Fscanf和Sscanf會讀取一整行以匹配格式字串;其他的函數將換行看著空格。Scanf, Fscanf, and Sscanf根據格式字串解析資料,類似於Printf。例如,%x將讀取一個十六進位數,%v將讀取值的預設表示。格式行為類似於Printf,但有如下例外:%p沒有提供%T沒有提供%e %E %f %F %g %G是等價的,都可以讀取任何浮點數或者複合數(非複數,指科學計數法表示的帶指數的數)%s 和 %v字串使用這兩個格式讀取時會因為空白格而結束不設格式或者使用%v讀取整數時,如果首碼為0(八進位)或0x(十六進位),將按對應進位讀取。寬度在輸入中被解釋(%5s意思是最多從輸入讀取5個字元賦值給一個字串),但輸入系列函數沒有解釋精度的文法(木有%5.2f,只有%5f)。輸入系列函數中的格式字串,所有非空的空白字元(除了分行符號之外),無論在輸入裡還是格式字串裡,都等價於1個空白字元。格式字串必須匹配輸入的文本,如果不匹配將停止讀取資料並返回函數已經賦值的參數的數量。所有的scan系列函數,如果參數包含Scan方法(或者說實現了Scanner介面),該參數將使用該方法讀取文本。另外,如果被填寫的參數的數量少於提供的參數的數量,將返回一個錯誤。所有要被輸入的參數都應該是基礎類型或者實現了Scanner介面的資料類型的指標。注意:Fscan等函數可以從輸入略過一些字元讀取需要的字元並返回,這就意味著一個迴圈的讀取程式可能會跳過輸入的部分資料。當資料間沒有空白時就會導致出現問題。如果讀取這提供給Fscan系列函數ReadRune 方法,這個方法可以用來讀取字元。如果讀取者還提供了UnreadRune 方法,該方法將被用來儲存字元以使成功的調用不會遺失資料。為了給一個沒有這些功能的讀取者添加這倆方法,使用bufio.NewReader。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。