目錄 Printf、Sprintf、Fprintf差別 格式化輸出示例 Printf詳解 格式字元串 旗标 寬度和精度 arg 索引 動詞 通用動詞 布爾型 整型 浮點型和複數型 字元串或位元組切片 指針類型 複合類型
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
}

格式字元串由普通字元和占位符組成,例如:
"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 序号組成(就像上面示例中的 [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