fmt.Printf
fmt.Printf在程序中使用%f來格式化所需的值
看起來我們的值被四舍五入到了一個合理的數。但小數點后仍顯示了6位,這對我們當前的需要來說實在是太多了。
對於這種情況,格式化動詞允許你指定格式化值的寬度。
假設我們想在純文本表中格式化一些數據。我們需要確保格式化的值填充最少數量的空格,以便列能夠正確對齊。
可以在格式化動詞的百分號后面指定最小寬度。如果匹配該動詞的參數比最小寬度短,則將使用空格進行填充,直到達到最小寬度為止。
你可以使用值寬度來指定浮點數的精度(顯示的位數)。格式如下:
整個數的最小寬度包括數字位和小數點。如果包括的話,較短的數將在開始處填充空格,直到達到這個寬度。如果省略的話,就不會添加任何空格。
小數點后的寬度是要顯示的小數位數。如果給出更精確的數字,它將被四舍五入(向上或向下)以適應給定的小數位數。下面是運行中的各種寬度值的快速演示:
最后一種格式是"%.2f",將允許我們取任意精度的浮點數,並將它們四舍五入到小數點后兩位。(它也不會做任何不必要的填充。)
fmt.Sprintf
fmt.Sprintf格式化在邏輯中非常常用。使用格式化函數,要注意寫法:
fmt.Sprintf(格式化樣式, 參數列表…)
- 格式化樣式:字符串形式,格式化動詞以
%
開頭。 - 參數列表:多個參數以逗號分隔,個數必須與格式化樣式中的個數一一對應,否則運行時會報錯。
在 Go 語言中,格式化的命名延續C語言風格:
package main
import (
"fmt"
)
func main() {
var progress = 2
var target = 8
// 兩參數格式化
title := fmt.Sprintf("已采集%d個葯草, 還需要%d個完成任務", progress, target)
fmt.Println(title)
pi := 3.14159
// 按數值本身的格式輸出
variant := fmt.Sprintf("%v %v %v", "月球基地", pi, true)
fmt.Println(variant)
// 匿名結構體聲明, 並賦予初值
profile := &struct {
Name string
HP int
}{
Name: "rat", HP: 150}
fmt.Printf("使用'%%+v' %+v\n", profile)
fmt.Printf("使用'%%#v' %#v\n", profile)
fmt.Printf("使用'%%T' %T\n", profile)
}
代碼輸出如下:
已采集2個葯草, 還需要8個完成任務 "月球基地" 3.14159 true 使用'%+v' &{Name:rat HP:150} 使用'%#v' &struct { Name string; HP int }{Name:"rat", HP:150} 使用'%T' *struct { Name string; HP int }C語言中, 使用%d代表整型參數
fmt.Sprintf("%0*d", 8, 123) 結果是 00000123 %0*d % 表示這個是一個 格式控制串 0 這個填充字符,表示當輸出長度不足指定長度時候, 用 0填充不足的部分 * 是占位符,表示具體的寬度由后面的參數來指定輸出寬度 d 這個表示輸出整數 fmt.Sprintf( "%0*d", 5, 123 ); 也等價於 fmt.Sprintf("%05d",123);結果也是 00123
下表中標出了常用的一些格式化樣式中的動詞及功能。
動 詞 | 功 能 |
---|---|
%v | 按值的本來值輸出 |
%+v | 在 %v 基礎上,對結構體字段名和值進行展開 |
%#v | 輸出 Go 語言語法格式的值 |
%T | 輸出 Go 語言語法格式的類型和值 |
%% | 輸出 % 本體 |
%b | 整型以二進制方式顯示 |
%o | 整型以八進制方式顯示 |
%d | 整型以十進制方式顯示 |
%x | 整型以十六進制方式顯示 |
%X | 整型以十六進制、字母大寫方式顯示 |
%U | Unicode 字符 |
%f | 浮點數 |
%p | 指針,十六進制方式顯示 |
\n
:換行符\r
:回車符\t
:tab 鍵\u
或\U
:Unicode 字符\\
:反斜杠自身