目錄
Printf、Sprintf、Fprintf區別
Print: 輸出到控制檯(不接受任何格式化,它等價於對每一個操作數都應用 %v)
fmt.Print(str)
Println: 輸出到控制檯並換行
fmt.Println(tmp)
Printf : 只可以打印出格式化的字符串。只可以直接輸出字符串類型的變量
fmt.Printf("%d",a)
Sprintf:格式化並返回一個字符串而不帶任何輸出。
s := fmt.Sprintf("a %s", "string") fmt.Printf(s)
Fprintf:來格式化並輸出到 io.Writers 而不是 os.Stdout。
fmt.Fprintf(os.Stderr, “an %s\n”, “error”)
格式化輸出示例
package main
import (
"fmt"
"os"
)
type point struct {
x, y int
}
func main() {
// ++++++++++++++++【結構體】++++++++++++++++++
//Go 爲常規 Go 值的格式化設計提供了多種打印方式。例如,這裏打印了 point 結構體的一個實例。
p := point{1, 2}
fmt.Printf("%v\n", p) // {1 2}
//如果值是一個結構體,%+v 的格式化輸出內容將包括結構體的字段名。
fmt.Printf("%+v\n", p) // {x:1 y:2}
//%#v 形式則輸出這個值的 Go 語法表示。例如,值的運行源代碼片段。
fmt.Printf("%#v\n", p) // main.point{x:1, y:2}
//需要打印值的類型,使用 %T。
fmt.Printf("%T\n", p) // main.point
// ++++++++++++++++【】++++++++++++++++++
//格式化布爾值是簡單的。
fmt.Printf("%t\n", true) // true
//格式化整形數有多種方式,使用 %d進行標準的十進制格式化。
fmt.Printf("%d\n", 123) // 123
//這個輸出二進制表示形式。
fmt.Printf("%b\n", 14) // 1110
//這個輸出給定整數的對應字符。
fmt.Printf("%c\n", 33) // !
//%x 提供十六進制編碼。
fmt.Printf("%x\n", 456) // 1c8
//對於浮點型同樣有很多的格式化選項。使用 %f 進行最基本的十進制格式化。
fmt.Printf("%f\n", 78.9) // 78.900000
//%e 和 %E 將浮點型格式化爲(稍微有一點不同的)科學技科學記數法表示形式。
fmt.Printf("%e\n", 123400000.0) // 1.234000e+08
fmt.Printf("%E\n", 123400000.0) // 1.234000E+08
// ++++++++++++++++【字符串】++++++++++++++++++
//使用 %s 進行基本的字符串輸出。
fmt.Printf("%s\n", "\"string\"") // "string"
fmt.Printf("abc%+ #8.3[3]vdef\n") // abc%!v(BADINDEX)def
//像 Go 源代碼中那樣帶有雙引號的輸出,使用 %q。
fmt.Printf("%q\n", "\"string\"") // "\"string\""
//和上面的整形數一樣,%x 輸出使用 base-16 編碼的字符串,每個字節使用 2 個字符表示。
fmt.Printf("%x\n", "hex this") // 6865782074686973
// ++++++++++++++++【指針】++++++++++++++++++
//要輸出一個指針的值,使用 %p。
fmt.Printf("%p\n", &p) // 0xc000072090
// ++++++++++++++++【寬度和精度控制】++++++++++++++++++
//當輸出數字的時候,你將經常想要控制輸出結果的寬度和精度,
//可以使用在 % 後面使用數字來控制輸出寬度。默認結果使用右對齊並且通過空格來填充空白部分。
fmt.Printf("|%6d|%6d|\n", 12, 345) // | 12| 345|
//你也可以指定浮點型的輸出寬度,同時也可以通過 寬度.精度 的語法來指定輸出的精度。
fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45) // | 1.20| 3.45|
//要最對齊,使用 - 標誌。
fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45) // |1.20 |3.45 |
//你也許也想控制字符串輸出時的寬度,特別是要確保他們在類表格輸出時的對齊。這是基本的右對齊寬度表示。
fmt.Printf("|%6s|%6s|\n", "foo", "b") // | foo| b|
//要左對齊,和數字一樣,使用 - 標誌。
fmt.Printf("|%-6s|%-6s|\n", "foo", "b") // |foo |b |
// ++++++++++++++++【Sprintf】++++++++++++++++++
//到目前爲止,我們已經看過 Printf了,它通過 os.Stdout輸出格式化的字符串。
// Sprintf 則格式化並返回一個字符串而不帶任何輸出。
s := fmt.Sprintf("a %s", "string") //
fmt.Println(s) // a string
// ++++++++++++++++【Fprintf】++++++++++++++++++
//你可以使用 Fprintf 來格式化並輸出到 io.Writers而不是 os.Stdout。
fmt.Fprintf(os.Stderr, "an %s\n", "error") // an error
}
Printf詳解
格式字符串
格式字符串由普通字符和佔位符組成,例如:
"abc%+ #8.3[3]vdef"
其中 abc 和 def 是普通字符,其它部分是佔位符,
佔位符以 % 開頭(注:%% 將被轉義爲一個普通的 % 符號,這個不算開頭),以動詞結尾,格式如下:
- %[旗標][寬度][.精度][arg索引]動詞
- 方括號中的內容可以省略。
旗標
旗標有以下幾種:
+ :對於數值類型總是輸出正負號(其它用法在動詞部分說明)。
- :在右邊進行寬度填充,而不是默認的左邊。
空格:對於數值類型的正數,保留一個空白的符號位(其它用法在動詞部分說明)。
0 :用 0 進行寬度填充而不用空格,對於數值類型,符號將被移到所有 0 的前面。
# :相關用法在動詞部分說明。
其中 "0" 和 "-" 不能同時使用,優先使用 "-" 而忽略 "0"。
寬度和精度
“寬度”和“精度”都可以寫成以下三種形式:
數值 | * | arg索引*
- 其中“數值”表示使用指定的數值作爲寬度值或精度值,
- “*”表示使用當前正在處理的 arg 的值作爲寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉到下一個。
- “arg索引*”表示使用指定 arg 的值作爲寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉到指定 arg 的下一個。
寬度值:用於設置最小寬度。
精度值:對於浮點型,用於控制小數位數,對於字符串或字節數組,用於控制字符數量(不是字節數量)。
對於浮點型而言,動詞 g/G 的精度值比較特殊,在適當的情況下,g/G 會設置總有效數字,而不是小數位數。
arg 索引
“arg索引”由中括號和 arg 序號組成(就像上面示例中的 [3]),用於指定當前要處理的 arg 的序號,序號從 1 開始:
'[' + arg序號 + ']'
動詞
“動詞”不能省略,不同的數據類型支持的動詞不一樣。
通用動詞
v:默認格式,不同類型的默認格式如下:
布爾型:t
整 型:d
浮點型:g
複數型:g
字符串:s
通 道:p
指 針:p#v:默認格式,以符合 Go 語法的方式輸出。特殊類型的 Go 語法格式如下:
無符號整型:x
T:輸出 arg 的類型而不是值(使用 Go 語法格式)。
布爾型
t:輸出 true 或 false 字符串。
整型
b/o/d:輸出 2/8/10 進制格式
x/X :輸出 16 進制格式(小寫/大寫)
c :輸出數值所表示的 Unicode 字符
q :輸出數值所表示的 Unicode 字符(帶單引號)。對於無法顯示的字符,將輸出其轉義字符。
U :輸出 Unicode 碼點(例如 U+1234,等同於字符串 "U+%04X" 的顯示結果)對於 o/x/X:
如果使用 "#" 旗標,則會添加前導 0 或 0x。對於 U:
如果使用 "#" 旗標,則會在 Unicode 碼點後面添加相應的 '字符'(前提是該字符必須可顯示)
浮點型和複數型
b :科學計數法(以 2 爲底)
e/E:科學計數法(以 10 爲底,小寫 e/大寫 E)
f/F:普通小數格式(兩者無區別)
g/G:大指數(指數 >= 6)使用 %e/%E,其它情況使用 %f/%F
字符串或字節切片
s :普通字符串
q :雙引號引起來的 Go 語法字符串
x/X:十六進制編碼(小寫/大寫,以字節爲元素進行編碼,而不是字符)對於 q:
如果使用了 "+" 旗標,則將所有非 ASCII 字符都進行轉義處理。
如果使用了 "#" 旗標,則輸出反引號引起來的字符串(前提是
字符串中不包含任何製表符以外的控制字符,否則忽略 # 旗標)對於 x/X:
如果使用了 " " 旗標,則在每個元素之間添加空格。
如果使用了 "#" 旗標,則在十六進制格式之前添加 0x 前綴。
指針類型
p :帶 0x 前綴的十六進制地址值。
#p:不帶 0x 前綴的十六進制地址值。
複合類型
複合類型將使用不同的格式輸出,格式如下:
結 構 體:{字段1 字段2 ...}
數組或切片:[元素0 元素1 ...]
映 射:map[鍵1:值1 鍵2:值2 ...]指向符合元素的指針:&{}, &[], &map[]
複合類型本身沒有動詞,動詞將應用到複合類型的元素上。
結構體可以使用 "+v" 同時輸出字段名。
參考鏈接:
https://www.cnblogs.com/golove/p/3284304.html
http://golang-examples.tumblr.com/post/86795367134/fmt-printf-format-reference-cheat-sheet