Go
語言用於控制文本輸出常用的標准庫是fmt
fmt
中主要用於輸出的函數有:
- Print: 輸出到控制台,不接受任何格式化操作
- Println: 輸出到控制台並換行
- Printf: 只可以打印出格式化的字符串,只可以直接輸出字符串類型的變量(不可以輸出別的類型)
- Sprintf: 格式化並返回一個字符串而不帶任何輸出
- Fprintf: 來格式化並輸出到
io.Writers
而不是os.Stdout
通過Printf
函數來測試下Go
語言里面的字符串格式化:
fmt.Sprintf(格式化樣式, 參數列表…)
- 格式樣式: 字符串形式,格式化符號以
%
開頭,%s
字符串格式,%d
十進制的整數格式 - 參數列表: 多個參數以逗號分隔,個數必須與格式化樣式中的個數一一對應,否則運行時會報錯
比如:
username := "boy"
fmt.Printf("welcome, %s", username)
1、整數格式化
格 式 | 描 述 |
---|---|
%b | 整型以二進制方式顯示 |
%o | 整型以八進制方式顯示 |
%d | 整型以十進制方式顯示 |
%x | 整型以十六進制方式顯示 |
%X | 整型以十六進制、字母大寫方式顯示 |
%c | 相應Unicode碼點所表示的字符 |
%U | Unicode 字符, Unicode格式:123,等同於 "U+007B" |
a := 255
fmt.Printf("二進制: %b\n", a)
fmt.Printf("八進制: %o\n", a)
fmt.Printf("十進制: %d\n", a)
fmt.Printf("十六進制: %x\n", a)
fmt.Printf("大寫十六進制: %X\n", a)
fmt.Printf("十六進制: %d\n", Hex2Dec("4E2D"))
fmt.Printf("字符: %c\n", 20013)
fmt.Printf("Unicode格式: %U\n", '中') // U+4E2D
2、浮點數格式化
格 式 | 描 述 |
---|---|
%e | 科學計數法,例如 -1234.456e+78 |
%E | 科學計數法,例如 -1234.456E+78 |
%f | 有小數點而無指數,例如 123.456 |
%g | 根據情況選擇 %e 或 %f 以產生更緊湊的(無末尾的0)輸出 |
%G | 根據情況選擇 %E 或 %f 以產生更緊湊的(無末尾的0)輸出 |
fmt.Printf("%e", 12675757563.5345432567) //1.267576e+10
fmt.Printf("%E", 12675757563.5345432567) // 1.267576E+10
fmt.Printf("%f", 12675757563.5345432567) // 12675757563.534544
fmt.Printf("%g", 12675757563.5345432567) // 1.2675757563534544e+10
fmt.Printf("%G", 12675757563.5345432567) // 1.2675757563534544E+1
3、布爾類型格式化
格 式 | 描 述 |
---|---|
%t | true 或 false |
fmt.Printf("%t", true)
4、字符串格式化
格 式 | 描 述 |
---|---|
%s | 字符串或切片的無解譯字節 |
%q | 雙引號圍繞的字符串,由Go語法安全地轉義 |
%x | 十六進制,小寫字母,每字節兩個字符 |
%X | 十六進制,大寫字母,每字節兩個字符 |
str := "I'm a boy"
fmt.Printf("%s", str)
fmt.Println()
fmt.Printf("%q", str)
fmt.Println()
fmt.Printf("%x", str)
fmt.Println()
fmt.Printf("%X", str)
fmt.Println()
5、指針格式化
格 式 | 描 述 |
---|---|
%p | 十六進制表示,前綴 0x |
a := "I'm a boy"
b := &a
fmt.Printf("%p", b)
6、通用的占位符
格 式 | 描 述 |
---|---|
%v | 值的默認格式。 |
%+v | 類似%v,但輸出結構體時會添加字段名 |
%#v | 相應值的Go語法表示 |
%T | 相應值的類型的Go語法表示 |
%% | 百分號,字面上的%,非占位符含義 |
默認格式%v
下,對於不同的數據類型,底層會去調用默認的格式化方式:
bool: %t
int, int8 etc.: %d
uint, uint8 etc.: %d, %x if printed with %#v
float32, complex64, etc: %g
string: %s
chan: %p
pointer: %p
示例
f := 1010.0101
s := "hey boy!"
fmt.Printf("%v", f)
fmt.Println()
fmt.Printf("%v", s)
fmt.Println()
如果是復雜對象的話,按照如下規則進行打印:
struct: {field0 field1 ...}
array, slice: [elem0 elem1 ...]
maps: map[key1:value1 key2:value2]
pointer to above: &{}, &[], &map[]
示例
user := User{"laowang", 33}
fmt.Printf("%v", user) // Go默認形式 {laowang 33}
fmt.Println()
fmt.Printf("%#v", user) //類型+值對象 day2.User{Name:"laowang", Age:33}
fmt.Println()
fmt.Printf("%+v", user) //輸出字段名和字段值形式 {Name:laowang Age:33}
fmt.Println()
fmt.Printf("%T", user) //值類型的Go語法表示形式, day2.User
fmt.Println()
fmt.Printf("%%")
7、寬度
我們輸出時 可能需要控制字符串的寬度和小數的精度
7.1 字符串寬度控制
寬度設置格式: 占位符中間加一個數字, 數字分正負, +: 右對齊, -: 左對齊
1.最小寬度, 不夠部分可以選擇補0
fmt.Printf("|%s|", "aa") // 不設置寬度
fmt.Printf("|%5s|", "aa") // 5個寬度, 默認+, 右對齊
fmt.Printf("|%-5s|", "aa") // 5個寬度, 左對齊
fmt.Printf("|%05s|", "aa") // |000aa|
2.最大寬度, 超出的部分會被截斷
fmt.Printf("|%.5s|", "xxxx") // 最大寬度為5
7.2 浮點數精度控制
你也可以指定浮點型的輸出寬度,同時也可以通過 寬度.精度 的語法來指定輸出的精度
a := 54.123456
fmt.Printf("|%f|", a) // |54.123456|
fmt.Printf("|%5.1f|", a) // | 54.1|
fmt.Printf("|%-5.1f|", a) // |54.1 |
fmt.Printf("|%05.1f|", a) // |054.1|
思考: 不同語言的文字寬度並不一定相同, 比如
fmt.Printf("|%2s|", "中國")
fmt.Printf("|%2s|", "ab")
可以參考該解決辦法: 獲取字符的寬度
8、格式化錯誤
1.類型錯誤或未知: %!verb(type=value)
Printf("%d", "hi") // %!d(string=hi)
2.太多參數: %!(EXTRA type=value)
Printf("hi", "guys") // hi%!(EXTRA string=guys)
3.太少參數: %!verb(MISSING)
Printf("hi%d") // hi %!d(MISSING)
4.寬度/精度不是整數值: %!(BADWIDTH) or %!(BADPREC)
Printf("%d", hi) // %!d(string=hi)