?
This document uses PHP Chinese website manual Release
import "fmt"
概述
索引
fmt 包使用函數(shù)實現(xiàn) I/O 格式化(類似于 C 的 printf 和 scanf 的函數(shù)), 格式化參數(shù)源自C,但更簡單
動詞:
一般:
%v默認(rèn)格式的值 打印結(jié)構(gòu)時,加號標(biāo)志(%+ v)添加字段名稱 %#v是值的Go語法表示 %T是值類型的Go語法表示%%一個百分號; 消耗沒有價值
布爾:
%t the word true or false
整數(shù):
%b base 2%c由相應(yīng)的Unicode代碼點表示的字符 %d基數(shù)10%base 8%q使用Go語法安全轉(zhuǎn)義的單引號字符文字。 %x base 16,af為小寫字母 %X base 16,AF大寫字母 %U Unicode格式:U + 1234; 與“U +%04X”相同
浮點和復(fù)雜的組成部分:
%b十進(jìn)制科學(xué)記數(shù)法,指數(shù)冪為2, 以strconv.FormatFloat的方式使用'b'格式, 例如-123456p-78%e科學(xué)記數(shù)法,例如-1.234456e + 78%E科學(xué)記數(shù)法,例如-1.234456E + 78%f小數(shù)點但沒有指數(shù),例如123.456%F%f的同義詞 對于大指數(shù),%g%e,否則為%f。精度將在下面討論。 對于大指數(shù),%G%E,否則為%F
字符串和字節(jié)片段(與這些動詞等同處理):
%s字符串或切片的未解釋字節(jié) %q使用Go語法安全轉(zhuǎn)義雙引號字符串 %x base 16,小寫,每個字節(jié)兩個字符 %X base 16,大寫,每個字節(jié)兩個字符
指針:
%p base 16表示法,帶前導(dǎo)0x
%v的默認(rèn)格式是:
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ù)合對象,使用這些規(guī)則以遞歸方式打印元素,如下所示:
struct: {field0 field1 ...}array, slice: [elem0 elem1 ...]maps: map[key1:value1 key2:value2]pointer to above: &{}, &[], &map[]
寬度由動詞前面的可選十進(jìn)制數(shù)字指定。如果不存在,則寬度是表示該值所需的任何值。在(可選)寬度之后指定精度,后面跟著一個十進(jìn)制數(shù)。如果沒有句點,則使用默認(rèn)精度。沒有以下數(shù)字的時間段指定零的精度。例子:
%f default width, default precision%9f width 9, default precision%.2f default width, precision 2%9.2f width 9, precision 2%9.f width 9, precision 0
寬度和精度是以 Unicode 代碼點為單位測量的,即符文。(這與C的 printf 不同,后者的單位總是以字節(jié)為單位)。其中一個或兩個標(biāo)志都可以用字符 '*' 替換,使得它們的值從下一個操作數(shù)獲得,該操作數(shù)必須是 int 類型。
對于大多數(shù)值,width 是要輸出的最小符號數(shù),如果需要,可以用空格填充格式化的表單。
然而,對于字符串,字節(jié)片段和字節(jié)數(shù)組,精度會限制要格式化的輸入的長度(而不是輸出的大?。?,如果需要則會截斷。通常以符文測量,但對于使用 %x 或 %X 格式格式化的這些類型,則以字節(jié)為單位進(jìn)行測量。
對于浮點值,寬度設(shè)置字段的最小寬度,精度設(shè)置小數(shù)點后的位數(shù)(如果適用),但%g/%G精度設(shè)置有效數(shù)字的總數(shù)。例如,給定 12.345 格式%6.3f 打印輸出 12.345,而%.3g 打印輸出 12.3。%e,%f和%#g的默認(rèn)精度為6;對于%g,它是唯一標(biāo)識值所需的最小位數(shù)。
對于復(fù)數(shù),寬度和精度獨立應(yīng)用于這兩個組件,并將結(jié)果括起來,因此 %f 應(yīng)用于1.2 + 3.4i會產(chǎn)生(1.200000 + 3.400000i)。
其他標(biāo)志:
+始終打印數(shù)字值的符號; 保證%q(%+ q)的僅ASCII輸出- 在右側(cè)而不是左側(cè)使用空格(左側(cè)對齊場) #alternate format:為八進(jìn)制添加前導(dǎo)0(%#o),為十六進(jìn)制添加0x(%#x); 十六進(jìn)制為0X(%#X); 抑制%p為%p(%#p); 對于%q,如果strconv.CanBackquote打印一個原始(反引號)字符串 返回true; 始終為%e,%E,%f,%F,%g和%G打印小數(shù)點; 不要刪除%g和%G的尾隨零; 如果字符可打印為%U(%#U),則寫入例如U + 0078'x'。''(空格)留下一個空格,用于刪除號碼(%d); 在字節(jié)之間放置以十六進(jìn)制打印字符串或切片的空格(%x,%X)0墊帶前導(dǎo)零而不是空格; 對于數(shù)字,這會在符號后移動填充
標(biāo)志被不期望它們的動詞忽略。例如,沒有替代的十進(jìn)制格式,因此 %#d 和 %d 的行為相同。
對于每個類似 Printf 的函數(shù),還有一個不帶格式的打印函數(shù),相當(dāng)于對每個操作數(shù)表示 %v。另一個變體 Println 在操作數(shù)之間插入空格并附加換行符。
無論動詞如何,如果操作數(shù)是接口值,則使用內(nèi)部具體值,而不是接口本身。從而:
var i interface{} = 23fmt.Printf("%v\n", i)
將打印23。
除使用動詞 %T 和 %p 打印外,特殊的格式考慮適用于實現(xiàn)某些接口的操作數(shù)。按申請順序:
如果操作數(shù)是 reflect.Value,則操作數(shù)將由其保存的具體值替換,打印將繼續(xù)執(zhí)行下一個規(guī)則。
2. 如果一個操作數(shù)實現(xiàn)了Formatter接口,它將被調(diào)用。格式化程序可以很好地控制格式。
3. 如果%v verb 與#flag(%#v)一起使用,并且操作數(shù)實現(xiàn) GoStringer 接口,則會調(diào)用該語句。如果格式(對于 Println 等隱式為 %v)對字符串(%s%q%v%x%X)有效,則適用以下兩個規(guī)則:
4. 如果操作數(shù)實現(xiàn)了錯誤接口,則將調(diào)用 Error 方法將對象轉(zhuǎn)換為字符串,然后根據(jù)動詞的需要對其進(jìn)行格式化(如果有)。
5. 如果操作數(shù)實現(xiàn)方法 String() 字符串,則將調(diào)用該方法將對象轉(zhuǎn)換為字符串,然后根據(jù)動詞(如果有)格式化該字符串。
對于復(fù)合操作數(shù)(如切片和結(jié)構(gòu)),格式以遞歸方式應(yīng)用于每個操作數(shù)的元素,而不是作為整體應(yīng)用于操作數(shù)。因此,%q將引用一個字符串片段的每個元素,%6.2f 將控制浮點數(shù)組的每個元素的格式。
但是,當(dāng)使用類似字符串的動詞(%s%q%x%X)打印字節(jié)切片時,它將作為單個項目與字符串相同地處理。
避免在諸如此類的情況下遞歸
type X stringfunc (x X) String() string { return Sprintf("<%s>", x) }
在重復(fù)之前轉(zhuǎn)換值:
func (x X) String() string { return Sprintf("<%s>", string(x)) }
無限遞歸也可以由自引用數(shù)據(jù)結(jié)構(gòu)觸發(fā),例如包含自身作為元素的切片,如果該類型具有String方法。然而,這種病癥是罕見的,并且包裝不能防止它們。
打印結(jié)構(gòu)時,fmt不能,因此不會在未導(dǎo)出的字段上調(diào)用錯誤或字符串等格式化方法。
顯式參數(shù)索引:
在Printf,Sprintf和Fprintf中,默認(rèn)行為是每個格式化動詞格式化調(diào)用中傳遞的連續(xù)參數(shù)。但是,緊接在動詞之前的符號[n]表示要格式化第n個單索引參數(shù)。寬度或精度的'*'前面的相同符號選擇保存該值的參數(shù)索引。在處理括號內(nèi)的表達(dá)式[n]之后,除非另有指示,否則后續(xù)動詞將使用參數(shù)n + 1,n + 2等。
例如,
fmt.Sprintf("%[2]d %[1]d\n", 11, 22)
將產(chǎn)生“22 11”,而
fmt.Sprintf("%[3]*.[2]*[1]f", 12.0, 2, 6)
相當(dāng)于
fmt.Sprintf("%6.2f", 12.0)
將產(chǎn)生“12.00”。因為顯式索引會影響后續(xù)動詞,所以通過重置要重復(fù)的第一個參數(shù)的索引,可以使用此表示法多次打印相同的值:
fmt.Sprintf("%d %d %#[1]x %#x", 16, 17)
將產(chǎn)生“16 17 0x10 0x11”。
格式錯誤:
如果為動詞提供了無效參數(shù),例如向%d提供字符串,則生成的字符串將包含問題的描述,如下例所示:
Wrong type or unknown verb: %!verb(type=value)Printf("%d", hi): %!d(string=hi)Too many arguments: %!(EXTRA type=value)Printf("hi", "guys"): hi%!(EXTRA string=guys)Too few arguments: %!verb(MISSING)Printf("hi%d"): hi%!d(MISSING)Non-int for width or precision: %!(BADWIDTH) or %!(BADPREC)Printf("%*s", 4.5, "hi"): %!(BADWIDTH)hiPrintf("%.*s", 4.5, "hi"): %!(BADPREC)hi Invalid or invalid use of argument index: %!(BADINDEX)Printf("%*[2]d", 7): %!d(BADINDEX)Printf("%.[2]d", 7): %!d(BADINDEX)
所有錯誤都以字符串“%!”開頭。有時候是一個字符(動詞),最后是帶括號的描述。
如果錯誤或字符串方法在打印例程調(diào)用時觸發(fā)了混亂,則fmt軟件包會從恐慌中重新格式化錯誤消息,并通過fmt軟件包指示它。例如,如果 String 方法調(diào)用panic(“bad”),則生成的格式化消息將如下所示
%!s(PANIC=bad)
%!s只顯示故障發(fā)生時使用的打印動詞。但是,如果由 nil接收器引起的錯誤或字符串方法引起的混亂,則輸出是未修飾的字符串“<nil>”。
一組類似的函數(shù)掃描格式化文本以產(chǎn)生值。從os.Stdin 讀取Scan,Scanf 和 Scanln;Fscan,F(xiàn)scanf 和 Fscanln 從指定的io.Reader讀取; Sscan,Sscanf 和 Sscanln 從參數(shù)字符串中讀取。
Scan,F(xiàn)scan,Sscan 將輸入中的換行符視為空格。
Scanln,F(xiàn)scanln 和 Sscanln 在換行符處停止掃描并要求項目后跟換行符或 EOF。
Scanf,F(xiàn)scanf 和 Sscanf 根據(jù)格式字符串解析參數(shù),類似于 Printf 的格式字符串。在下面的文本中,'space' 表示除換行符之外的任何 Unicode 空白字符。
在格式字符串中,%字符引入的動詞消耗并解析輸入;這些動詞在下面更詳細(xì)地描述。格式中除%,空格或換行符之外的字符恰好消耗必須存在的輸入字符。在格式字符串中具有零個或多個空格的換行符在輸入中使用零個或多個空格,后跟單個換行符或輸入的結(jié)尾。格式字符串中換行符后面的空格在輸入中占用零個或多個空格。否則,格式字符串中的一個或多個空格的任何運行在輸入中消耗盡可能多的空格。除非格式字符串中的空格運行與換行符相鄰,否則運行必須至少占用輸入的一個空格或找到輸入的結(jié)尾。
空格和換行符的處理與C的 scanf 系列的處理不同:在C中,換行符被視為任何其他空格,當(dāng)格式字符串中的空格行沒有在輸入中消耗空間時,它永遠(yuǎn)不會出錯。
動詞的行為類似于 Printf。例如,%x 將整數(shù)掃描為十六進(jìn)制數(shù),%v 將掃描該值的默認(rèn)表示格式。Printf 動詞 %p和 %T 以及標(biāo)志#和+未實現(xiàn),動詞 %e%E%f%F%g和%G 都是等效的,并掃描任何浮點或復(fù)數(shù)值。
由動詞處理的輸入是隱式空格分隔的:除了 %c 之外的每個動詞的實現(xiàn)都是從剩余輸入中丟棄前導(dǎo)空格開始的,而 %s 動詞(和 %v 讀入字符串)在第一個空格處停止消耗輸入或換行符。
當(dāng)掃描沒有格式的整數(shù)或使用%v動詞時,接受熟悉的基本設(shè)置前綴0(八進(jìn)制)和0x(十六進(jìn)制)。
寬度在輸入文本中解釋,但沒有精確掃描的語法(沒有 %5.2f,只有 %5f)。如果提供了寬度,則在修剪前導(dǎo)空格后應(yīng)用寬度,并指定要讀取的最大符文數(shù)以滿足動詞。例如,
Sscanf(" 1234567 ", "%5s%d", &s, &i)
將s設(shè)置為“12345”,將i設(shè)置為67
Sscanf(" 12 34 567 ", "%5s%d", &s, &i)
將s設(shè)置為“12”,將i設(shè)置為 34。
在所有掃描功能中,緊接著換行后的回車被視為普通換行符(\r\n 表示與\n 相同)。
在所有掃描功能中,如果操作數(shù)實現(xiàn)方法 Scan(即,它實現(xiàn)了 Scanner 接口),則該方法將用于掃描該操作數(shù)的文本。此外,如果掃描的參數(shù)數(shù)量小于提供的參數(shù)數(shù)量,則返回錯誤。
要掃描的所有參數(shù)必須是指向基本類型的指針或 Scanner 接口的實現(xiàn)。
與 Scanf 和 Fscanf 一樣,Sscanf 無需消耗其全部輸入。無法恢復(fù)使用的輸入字符串 Sscanf 的數(shù)量。
注意:Fscan 等可以讀取它們返回的輸入之后的一個字符(符文),這意味著調(diào)用掃描例程的循環(huán)可能會跳過某些輸入。僅當(dāng)輸入值之間沒有空格時,這通常是一個問題。如果提供給 Fscan 的閱讀器實現(xiàn)了 ReadRune,那么該方法將用于讀取字符。如果讀者也實現(xiàn)了 UnreadRune,那么該方法將用于保存字符,連續(xù)調(diào)用不會丟失數(shù)據(jù)。要將 ReadRune 和 UnreadRune 方法附加到?jīng)]有該功能的閱讀器,請使用 bufio.NewReader。
func Errorf(format string, a ...interface{}) error
func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
func Scan(a ...interface{}) (n int, err error)
func Scanf(format string, a ...interface{}) (n int, err error)
func Scanln(a ...interface{}) (n int, err error)
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string
func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
type Formatter
type GoStringer
type ScanState
type Scanner
type State
type Stringer
doc.go format.go print.go scan.go
func Errorf(format string, a ...interface{}) error
Errorf 格式根據(jù)格式說明符并返回字符串作為滿足錯誤的值。
func Fprint(w io.Writer, a ...interface{}) (n int, err error)
使用其操作數(shù)的缺省格式并寫入w的 Fprint 格式。當(dāng)兩個操作數(shù)都不是字符串時,空間會被添加。它返回寫入的字節(jié)數(shù)和遇到的任何寫入錯誤。
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
Fprintf 根據(jù)格式說明符格式化并寫入w。它返回寫入的字節(jié)數(shù)和遇到的任何寫入錯誤。
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
Fprintln 使用其操作數(shù)的默認(rèn)格式格式化并寫入w。總是在操作數(shù)之間添加空格,并附加一個換行符。它返回寫入的字節(jié)數(shù)和遇到的任何寫入錯誤。
func Fscan(r io.Reader, a ...interface{}) (n int, err error)
Fscan 掃描從r讀取的文本,將連續(xù)的空格分隔值存儲為連續(xù)的參數(shù)。換行占據(jù)空間。它返回成功掃描的項目數(shù)量。如果這小于參數(shù)的數(shù)量,err 會報告原因。
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
Fscanf 掃描從 r 讀取的文本,將連續(xù)的空格分隔值存儲為由格式確定的連續(xù)參數(shù)。它返回成功解析的項目數(shù)。輸入中的換行符必須與格式中的換行符匹配。
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
Fscanln 與 Fscan 類似,但停止在換行符處進(jìn)行掃描,并且在最終項目后必須有換行符或 EOF。
func Print(a ...interface{}) (n int, err error)
使用其操作數(shù)的默認(rèn)格式打印格式并寫入標(biāo)準(zhǔn)輸出。當(dāng)兩個操作數(shù)都不是字符串時,空間會被添加。它返回寫入的字節(jié)數(shù)和遇到的任何寫入錯誤。
func Printf(format string, a ...interface{}) (n int, err error)
Printf 格式根據(jù)格式說明符寫入標(biāo)準(zhǔn)輸出。它返回寫入的字節(jié)數(shù)和遇到的任何寫入錯誤。
func Println(a ...interface{}) (n int, err error)
Println 格式使用其操作數(shù)的默認(rèn)格式并寫入標(biāo)準(zhǔn)輸出??偸窃诓僮鲾?shù)之間添加空格,并附加一個換行符。它返回寫入的字節(jié)數(shù)和遇到的任何寫入錯誤。
func Scan(a ...interface{}) (n int, err error)
掃描掃描從標(biāo)準(zhǔn)輸入讀取的文本,將連續(xù)的空格分隔值存儲為連續(xù)的參數(shù)。換行占據(jù)空間。它返回成功掃描的項目數(shù)量。如果這小于參數(shù)的數(shù)量,err 會報告原因。
func Scanf(format string, a ...interface{}) (n int, err error)
Scanf 掃描從標(biāo)準(zhǔn)輸入中讀取的文本,將連續(xù)的空格分隔值存儲為由格式確定的連續(xù)參數(shù)。它返回成功掃描的項目數(shù)量。如果這小于參數(shù)的數(shù)量,err 會報告原因。輸入中的換行符必須與格式中的換行符匹配。一個例外:動詞%c總是掃描輸入中的下一個符文,即使它是空格(或制表符等)或換行符。
func Scanln(a ...interface{}) (n int, err error)
Scanln 與 Scan 類似,但停止在換行符處進(jìn)行掃描,并且在最終項目后必須有換行符或 EOF。
func Sprint(a ...interface{}) string
Sprint 格式使用其操作數(shù)的默認(rèn)格式并返回結(jié)果字符串。當(dāng)兩個操作數(shù)都不是字符串時,空間會被添加。
func Sprintf(format string, a ...interface{}) string
Sprintf 根據(jù)格式說明符格式化并返回結(jié)果字符串。
func Sprintln(a ...interface{}) string
Sprintln 格式使用其操作數(shù)的默認(rèn)格式并返回結(jié)果字符串。總是在操作數(shù)之間添加空格,并附加一個換行符。
func Sscan(str string, a ...interface{}) (n int, err error)
Sscan 掃描參數(shù)字符串,將連續(xù)的空格分隔值存儲為連續(xù)的參數(shù)。換行占據(jù)空間。它返回成功掃描的項目數(shù)量。如果這小于參數(shù)的數(shù)量,err 會報告原因。
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
Sscanf 掃描參數(shù)字符串,將連續(xù)的空格分隔值存儲為由格式確定的連續(xù)參數(shù)。它返回成功解析的項目數(shù)。輸入中的換行符必須與格式中的換行符匹配。
func Sscanln(str string, a ...interface{}) (n int, err error)
Sscanln 與 Sscan 類似,但停止在換行符處進(jìn)行掃描,并且在最終項目后必須有換行符或 EOF。
格式化程序是通過使用自定義格式化程序的值實現(xiàn)的接口。Format 的實現(xiàn)可能會調(diào)用 Sprint(f) 或 Fprint(f) 等來生成其輸出。
type Formatter interface { Format(f State, c rune)}
GoStringer 由具有 GoString 方法的任何值實現(xiàn),該方法定義該值的 Go 語法。GoString 方法用于將作為操作數(shù)傳遞給 %#v 格式的值打印出來。
type GoStringer interface { GoString() string}
ScanState 表示傳遞給定制掃描儀的掃描儀狀態(tài)。掃描儀可以做一次一個符號掃描,或要求 ScanState 發(fā)現(xiàn)下一個由空格分隔的令牌。
type ScanState interface { // ReadRune從輸入中讀取下一個符文(Unicode代碼點)。 // 如果在Scanln,F(xiàn)scanln或Sscanln期間調(diào)用,ReadRune()將會 // 返回第一個'\n'或讀取超出后返回EOF // 指定的寬度。 ReadRune() (r rune, size int, err error) // UnreadRune導(dǎo)致下一次調(diào)用ReadRune返回相同的符文。 UnreadRune() error // SkipSpace會跳過輸入中的空格。 新線得到適當(dāng)?shù)奶幚?nbsp; // 正在進(jìn)行的操作; 請參閱包文檔 // 了解更多信息。 SkipSpace() // 如果skipSpace為true,Token會跳過輸入中的空格,然后返回 // 運行Unicode代碼點c滿足f(c)。 如果f為零, // !unicode.IsSpace(c)用于; 也就是說,令牌將保持非空格 // 字符。 對于正在進(jìn)行的操作,新線被適當(dāng)?shù)靥幚?nbsp; // 執(zhí)行; 有關(guān)更多信息,請參閱包文檔。 // 返回的切片指向可能被覆蓋的共享數(shù)據(jù) // 通過下一次調(diào)用Token,使用ScanState調(diào)用Scan功能 // 作為輸入,或當(dāng)調(diào)用Scan方法返回時。 Token(skipSpace bool, f func(rune) bool) (token []byte, err error) // Width返回width選項的值以及是否已設(shè)置。 // 該單位是Unicode代碼點。 Width() (wid int, ok bool) // 因為ReadRune是由接口實現(xiàn)的,所以Read永遠(yuǎn)不應(yīng)該 // 由掃描例程和有效實現(xiàn)調(diào)用 // ScanState可以選擇始終從Read返回錯誤。 Read(buf []byte) (n int, err error)}
掃描器是由任何具有 Scan 方法的值實現(xiàn)的,Scan 方法掃描輸入以表示值并將結(jié)果存儲在接收器中,該接收器必須是有用的指針。掃描方法被稱為 Scan,Scanf 或 Scanln 的任何參數(shù)來實現(xiàn)它。
type Scanner interface { Scan(state ScanState, verb rune) error}
狀態(tài)表示傳遞給自定義格式化程序的打印機狀態(tài)。它提供對io.Writer 接口的訪問,以及有關(guān)操作數(shù)格式說明符的標(biāo)志和選項的信息。
type State interface { // Write是調(diào)用以發(fā)出要打印的格式化輸出的函數(shù)。 Write(b []byte) (n int, err error) // Width返回width選項的值以及是否已設(shè)置。 Width() (wid int, ok bool) // Precision返回精度選項的值以及是否已設(shè)置。 Precision() (prec int, ok bool) // 標(biāo)志報告是否已設(shè)置標(biāo)志c(字符)。 Flag(c int) bool}
Stringer 由具有 String 方法的任何值實現(xiàn),該方法為該值定義“native”格式。String 方法用于將作為操作數(shù)傳遞的值打印為接受字符串或格式未打印的打印機(如Print)的任何格式。
type Stringer interface { String() string}