Go基礎:格式化輸出--Printf、Sprintf、Fprintf

目錄

Printf、Sprintf、Fprintf區別

格式化輸出示例

Printf詳解

格式字符串

旗標

寬度和精度

arg 索引

         動詞

通用動詞

布爾型

整型

浮點型和複數型

字符串或字節切片

指針類型

複合類型


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:輸出 truefalse 字符串。

整型

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:值12:值2 ...]

指向符合元素的指針:&{}, &[], &map[]

複合類型本身沒有動詞,動詞將應用到複合類型的元素上。

結構體可以使用 "+v" 同時輸出字段名。

參考鏈接:

https://www.cnblogs.com/golove/p/3284304.html

http://golang-examples.tumblr.com/post/86795367134/fmt-printf-format-reference-cheat-sheet

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章