天天看點

Go基礎:格式化輸出--Printf、Sprintf、FprintfPrintf、Sprintf、Fprintf差別格式化輸出示例Printf詳解

 目錄 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
}      
Go基礎:格式化輸出--Printf、Sprintf、FprintfPrintf、Sprintf、Fprintf差別格式化輸出示例Printf詳解

格式字元串由普通字元和占位符組成,例如:

"abc%+ #8.3[3]vdef"      
Go基礎:格式化輸出--Printf、Sprintf、FprintfPrintf、Sprintf、Fprintf差別格式化輸出示例Printf詳解

其中 abc 和 def 是普通字元,其它部分是占位符,

占位符以 % 開頭(注:%% 将被轉義為一個普通的 % 符号,這個不算開頭),以動詞結尾,格式如下:

  • %[旗标][寬度][.精度][arg索引]動詞
  • 方括号中的内容可以省略。

旗标有以下幾種:

+   :對于數值類型總是輸出正負号(其它用法在動詞部分說明)。

-   :在右邊進行寬度填充,而不是預設的左邊。

空格:對于數值類型的正數,保留一個空白的符号位(其它用法在動詞部分說明)。

0   :用 0 進行寬度填充而不用空格,對于數值類型,符号将被移到所有 0 的前面。

#   :相關用法在動詞部分說明。

  其中 "0" 和 "-" 不能同時使用,優先使用 "-" 而忽略 "0"。

“寬度”和“精度”都可以寫成以下三種形式:

數值 | * | arg索引*      
Go基礎:格式化輸出--Printf、Sprintf、FprintfPrintf、Sprintf、Fprintf差別格式化輸出示例Printf詳解
  • 其中“數值”表示使用指定的數值作為寬度值或精度值,
  • “*”表示使用目前正在處理的 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 将自動跳轉到下一個。
  • “arg索引*”表示使用指定 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 将自動跳轉到指定 arg 的下一個。

寬度值:用于設定最小寬度。

精度值:對于浮點型,用于控制小數位數,對于字元串或位元組數組,用于控制字元數量(不是位元組數量)。

對于浮點型而言,動詞 g/G 的精度值比較特殊,在适當的情況下,g/G 會設定總有效數字,而不是小數位數。

“arg索引”由中括号和 arg 序号組成(就像上面示例中的 [3]),用于指定目前要處理的 arg 的序号,序号從 1 開始:

'[' + arg序号 + ']'      
Go基礎:格式化輸出--Printf、Sprintf、FprintfPrintf、Sprintf、Fprintf差別格式化輸出示例Printf詳解

“動詞”不能省略,不同的資料類型支援的動詞不一樣。

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