Golang格式化輸出


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM