|
Fmt包 import "fmt" 簡介 ? Package fmt包含有格式化I/O函數(shù),類似于C語言的printf和scanf。格式字符串的規(guī)則來源于C但更簡單一些。 輸出 格式: 一般: %v 基本格式的值。當(dāng)輸出結(jié)構(gòu)體時(shí),擴(kuò)展標(biāo)志(%+v)添加成員的名字。the value in a default format. when printing structs, the plus flag (%+v) adds field names %#v 值的Go語法表示。 %T 值的類型的Go語法表示。 %% 百分號。 布爾型: %t 值的true或false 整型: %b 二進(jìn)制表示 %c 數(shù)值對應(yīng)的Unicode編碼字符 %d 十進(jìn)制表示 %o 八進(jìn)制表示 %q 單引號 %x 十六進(jìn)制表示,使用a-f %X 十六進(jìn)制表示,使用A-F %U Unicode格式: U+1234,等價(jià)于"U+%04X" 浮點(diǎn)數(shù): %b 無小數(shù)部分、兩位指數(shù)的科學(xué)計(jì)數(shù)法,和strconv.FormatFloat的'b'轉(zhuǎn)換格式一致。舉例:-123456p-78 %e 科學(xué)計(jì)數(shù)法,舉例:-1234.456e+78 %E 科學(xué)計(jì)數(shù)法,舉例:-1234.456E+78 %f 有小數(shù)部分,但無指數(shù)部分,舉例:123.456 %g 根據(jù)實(shí)際情況采用%e或%f格式(以獲得更簡潔的輸出) %G 根據(jù)實(shí)際情況采用%E或%f格式(以獲得更簡潔的輸出) 字符串和byte切片類型: %s 直接輸出字符串或者[]byte %q 雙引號括起來的字符串 %x 每個(gè)字節(jié)用兩字符十六進(jìn)制數(shù)表示(使用小寫a-f) %X 每個(gè)字節(jié)用兩字符十六進(jìn)制數(shù)表示(使用大寫A-F) 指針: %p 0x開頭的十六進(jìn)制數(shù)表示 木有'u'標(biāo)志。如果是無類型整數(shù),自然會打印無類型格式。類似的,沒有必要去區(qū)分操作數(shù)的大小(int8, int64)。 寬度和精度格式化控制是指的Unicode編碼字符的數(shù)量(不同于C的printf,它的這兩個(gè)因子指的是字節(jié)的數(shù)量。)兩者均可以使用'*'號取代(任一個(gè)或兩個(gè)都),此時(shí)它們的值將被緊接著的參數(shù)控制,這個(gè)操作數(shù)必須是整型。 對于數(shù)字,寬度設(shè)置總長度,精度設(shè)置小數(shù)部分長度。例如,格式%6.2f 輸出123.45。 對于字符串,寬度是輸出字符數(shù)目的最低數(shù)量,如果不足會用空格填充。精度是輸出字符數(shù)目的最大數(shù)量,超過則會截?cái)唷? 其它符號: + 總是輸出數(shù)值的正負(fù)號;對%q(%+q)將保證純ASCII碼輸出 - 用空格在右側(cè)填充空缺而不是默認(rèn)的左側(cè)。 # 切換格式:在八進(jìn)制前加0(%#o),十六進(jìn)制前加0x(%#x)或0X(%#X);廢除指針的0x(%#p); 對%q (%#q)如果可能的話輸出一個(gè)無修飾的字符串; 對%U(%#U)如果對應(yīng)數(shù)值是可打印字符輸出該字符。 ' ' 對數(shù)字(% d)空格會留一個(gè)空格在數(shù)字前并忽略數(shù)字的正負(fù)號; 對切片和字符串(% x, % X)會以16進(jìn)制輸出。 0 用前置0代替空格填補(bǔ)空缺。 每一個(gè)類似Printf的函數(shù),都會有一個(gè)同樣的Print函數(shù),此函數(shù)不需要format字符串,等價(jià)于對每一個(gè)參數(shù)設(shè)置為%v。另一個(gè)變體Println會在參數(shù)之間加上空格并在輸出結(jié)束后換行。 如果參數(shù)是一個(gè)接口值,將使用內(nèi)在的具體實(shí)現(xiàn)的值,而不是接口本身,%v參數(shù)不會被使用。如下: var i interface{} = 23 fmt.Printf("%v\n", i) 將輸出23。 如果參數(shù)實(shí)現(xiàn)了Formatter接口,該接口可用來更好的控制格式化。 如果格式(標(biāo)志對Println等是隱含的%v)是專用于字符串的(%s %q %v %x %X),還提供了如下兩個(gè)規(guī)則: 1. 如果一個(gè)參數(shù)實(shí)現(xiàn)了error接口,Error方法會用來將目標(biāo)轉(zhuǎn)化為字符串,隨后將被按給出的要求格式化。 2. 如果參數(shù)提供了String方法,這個(gè)方法將被用來將目標(biāo)轉(zhuǎn)換為字符串,然后將按給出的格式標(biāo)志格式化。 為了避免有可能的遞歸循環(huán),例如: type X string func (x X) String() string { return Sprintf("<%s>", x) } 會在遞歸循環(huán)前轉(zhuǎn)換值: func (x X) String() string { return Sprintf("<%s>", string(x)) } 錯(cuò)誤的格式: 如果提供了一個(gè)錯(cuò)誤的格式標(biāo)志,例如給一個(gè)字符串提供了%d標(biāo)志,生成的字符串將包含對該問題的描述,如下面的例子: 錯(cuò)誤或未知的格式標(biāo)志: %!verb(type=value) Printf("%d", hi): %!d(string=hi) 太多參數(shù): %!(EXTRA type=value) Printf("hi", "guys"): hi%!(EXTRA string=guys) 缺少參數(shù): %!verb(MISSING) Printf("hi%d"): hi %!d(MISSING) 使用非整數(shù)提供寬度和精度: %!(BADWIDTH) or %!(BADPREC) Printf("%*s", 4.5, "hi"): %!(BADWIDTH)hi Printf("%.*s", 4.5, "hi"): %!(BADPREC)hi 所有的錯(cuò)誤都使用"%!"起始,(緊隨單字符的格式標(biāo)志)以括號包圍的錯(cuò)誤描述結(jié)束。 輸入 一系列類似的函數(shù)讀取格式化的文本,生成值。Scan,Scanf和Scanln從os.Stdin讀?。籉scan,F(xiàn)scanf和Fscanln 從特定的io.Reader讀?。籗scan,Sscanf和Sscanln 從字符串讀??;Scanln,F(xiàn)scanln和Sscanln在換行時(shí)結(jié)束讀取,并要求數(shù)據(jù)連續(xù)出現(xiàn);Scanf,F(xiàn)scanf和Sscanf會讀取一整行以匹配格式字符串;其他的函數(shù)將換行看著空格。 Scanf, Fscanf, and Sscanf根據(jù)格式字符串解析數(shù)據(jù),類似于Printf。例如,%x將讀取一個(gè)十六進(jìn)制數(shù),%v將讀取值的默認(rèn)表示。 格式行為類似于Printf,但有如下例外: %p沒有提供 %T沒有提供 %e %E %f %F %g %G是等價(jià)的,都可以讀取任何浮點(diǎn)數(shù)或者復(fù)合數(shù)(非復(fù)數(shù),指科學(xué)計(jì)數(shù)法表示的帶指數(shù)的數(shù)) %s 和 %v字符串使用這兩個(gè)格式讀取時(shí)會因?yàn)榭崭穸Y(jié)束 不設(shè)格式或者使用%v讀取整數(shù)時(shí),如果前綴為0(八進(jìn)制)或0x(十六進(jìn)制),將按對應(yīng)進(jìn)制讀取。 寬度在輸入中被解釋(%5s意思是最多從輸入讀取5個(gè)字符賦值給一個(gè)字符串),但輸入系列函數(shù)沒有解釋精度的語法(木有%5.2f,只有%5f)。 輸入系列函數(shù)中的格式字符串,所有非空的空白字符(除了換行符之外),無論在輸入里還是格式字符串里,都等價(jià)于1個(gè)空白字符。格式字符串必須匹配輸入的文本,如果不匹配將停止讀取數(shù)據(jù)并返回函數(shù)已經(jīng)賦值的參數(shù)的數(shù)量。 所有的scan系列函數(shù),如果參數(shù)包含Scan方法(或者說實(shí)現(xiàn)了Scanner接口),該參數(shù)將使用該方法讀取文本。另外,如果被填寫的參數(shù)的數(shù)量少于提供的參數(shù)的數(shù)量,將返回一個(gè)錯(cuò)誤。 所有要被輸入的參數(shù)都應(yīng)該是基礎(chǔ)類型或者實(shí)現(xiàn)了Scanner接口的數(shù)據(jù)類型的指針。 注意:Fscan等函數(shù)可以從輸入略過一些字符讀取需要的字符并返回,這就意味著一個(gè)循環(huán)的讀取程序可能會跳過輸入的部分?jǐn)?shù)據(jù)。當(dāng)數(shù)據(jù)間沒有空白時(shí)就會導(dǎo)致出現(xiàn)問題。如果讀取這提供給Fscan系列函數(shù)ReadRune 方法,這個(gè)方法可以用來讀取字符。如果讀取者還提供了UnreadRune 方法,該方法將被用來保存字符以使成功的調(diào)用不會丟失數(shù)據(jù)。為了給一個(gè)沒有這些功能的讀取者添加這倆方法,使用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) Package files doc.go format.go print.go scan.go func Errorf func Errorf(format string, a ...interface{}) error Errorf根據(jù)格式字符串和參數(shù)表生成一個(gè)字符串,該字符串滿足error接口。 func Fprint func Fprint(w io.Writer, a ...interface{}) (n int, err error) Fprint將所有參數(shù)都使用默認(rèn)的格式寫入w。如果相鄰兩個(gè)參數(shù)都不是字符串時(shí),會在參數(shù)間添加空白。函數(shù)返回寫入的字節(jié)數(shù)和任何遇到的錯(cuò)誤。 func Fprintf func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) Fprintf根據(jù)格式字符串將參數(shù)寫入w。函數(shù)返回寫入的字節(jié)數(shù)和任何遇到的錯(cuò)誤。 func Fprintln func Fprintln(w io.Writer, a ...interface{}) (n int, err error) Fprintln將所有參數(shù)都使用默認(rèn)的格式寫入w并在最后添加換行。如果相鄰兩個(gè)參數(shù)都不是字符串時(shí),會在參數(shù)間添加空白。函數(shù)返回寫入的字節(jié)數(shù)和任何遇到的錯(cuò)誤。 func Fscan func Fscan(r io.Reader, a ...interface{}) (n int, err error) Fscan從r讀取文本,將連續(xù)的空白分割的數(shù)據(jù)存入連續(xù)的參數(shù)里。換行視同空白。它返回成功讀取的參數(shù)的數(shù)量。如果少于提供的參數(shù)的數(shù)量,返回值err將報(bào)告原因。 func Fscanf func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error) Fscanf從r讀取文本,根據(jù)格式字符串順序?qū)?shù)據(jù)存入?yún)?shù)中。它返回成功解析并存入的參數(shù)的數(shù)量。 func Fscanln func Fscanln(r io.Reader, a ...interface{}) (n int, err error) Fscanln類似Fscanf,但會在換行符中止,并且存入最后一條后時(shí)讀取位置必須有換行或者結(jié)束符。 func Print func Print(a ...interface{}) (n int, err error) Print將所有參數(shù)都使用默認(rèn)的格式寫入標(biāo)準(zhǔn)輸出。如果相鄰兩個(gè)參數(shù)都不是字符串時(shí),會在參數(shù)間添加空白。函數(shù)返回寫入的字節(jié)數(shù)和任何遇到的錯(cuò)誤。 func Printf func Printf(format string, a ...interface{}) (n int, err error) Printf根據(jù)格式字符串將參數(shù)寫入標(biāo)準(zhǔn)輸出。函數(shù)返回寫入的字節(jié)數(shù)和任何遇到的錯(cuò)誤。 func Println func Println(a ...interface{}) (n int, err error) Println將所有參數(shù)都使用默認(rèn)的格式寫入標(biāo)準(zhǔn)輸出并在最后添加換行。如果相鄰兩個(gè)參數(shù)均非字符串時(shí),會在參數(shù)間添加空白。函數(shù)返回寫入的字節(jié)數(shù)和任何遇到的錯(cuò)誤。 func Scan func Scan(a ...interface{}) (n int, err error) Scan從標(biāo)準(zhǔn)輸入讀取文本,將空白分割的連續(xù)數(shù)據(jù)順序存入?yún)?shù)里。換行視同空白。它返回成功讀取的參數(shù)的數(shù)量。如果少于提供的參數(shù)的數(shù)量,返回值err將報(bào)告原因。 func Scanf func Scanf(format string, a ...interface{}) (n int, err error) Scanf從標(biāo)準(zhǔn)輸入讀取文本,根據(jù)格式字符串順序?qū)?shù)據(jù)存入?yún)?shù)中。它返回成功解析并存入的參數(shù)的數(shù)量。 func Scanln func Scanln(a ...interface{}) (n int, err error) Scanln類似Scan,但會在換行符中止,并且存入最后一條后時(shí)讀取位置必須有換行或者結(jié)束符。 func Sprint func Sprint(a ...interface{}) string Sprint將所有參數(shù)都使用默認(rèn)的格式寫入并生成一個(gè)字符串。如果相鄰兩個(gè)參數(shù)都不是字符串時(shí),會在參數(shù)間添加空白。 func Sprintf func Sprintf(format string, a ...interface{}) string Sprintf根據(jù)格式字符串將參數(shù)寫入并返回生成的字符串。 func Sprintln func Sprintln(a ...interface{}) string Sprintln將所有參數(shù)都使用默認(rèn)的格式寫入并生成一個(gè)字符串。如果相鄰兩個(gè)參數(shù)都不是字符串時(shí),會在參數(shù)間添加空白。字符串最后會添加換行符。 func Sscan func Sscan(str string, a ...interface{}) (n int, err error) Sscan從字符串讀取文本,將空白分割的連續(xù)數(shù)據(jù)順序存入?yún)?shù)里。換行視同空白。它返回成功讀取的參數(shù)的數(shù)量。如果少于提供的參數(shù)的數(shù)量,返回值err將報(bào)告原因。 func Sscanf func Sscanf(str string, format string, a ...interface{}) (n int, err error) Scanf從字符串讀取文本,根據(jù)格式字符串順序?qū)?shù)據(jù)存入?yún)?shù)中。它返回成功解析并存入的參數(shù)的數(shù)量。 func Sscanln func Sscanln(str string, a ...interface{}) (n int, err error) Sscanln類似Sscan,但會在換行符中止,并且存入最后一條后時(shí)讀取位置必須有換行或者結(jié)束符。 type Formatter type Formatter interface { Format(f State, c rune) } Formatter是一個(gè)供用戶定制的格式化接口。Format方法的實(shí)現(xiàn)可能需要調(diào)用Sprintf 或Fprintf(f)等函數(shù)來生成輸出。 type GoStringer type GoStringer interface { GoString() string } GoStringer接口由任意包含GoString方法的數(shù)據(jù)實(shí)現(xiàn),這個(gè)方法定義了數(shù)據(jù)的Go語法格式。GoString方法用來在使用%#v格式標(biāo)志時(shí)輸出值。 type ScanState type ScanState interface { // ReadRune函數(shù)從輸入讀取下一個(gè)Unicode符號。如果在Scanln,F(xiàn)scanln或Sscanln中調(diào)用,本函數(shù)會在讀取到第一個(gè)'\n'或達(dá)到最大寬度時(shí)返回EOF。 ReadRune() (r rune, size int, err error) // UnreadRune會讓ReadRune的下一次調(diào)用返回同一個(gè)字符。 UnreadRune() error // SkipSpace跳過輸入的空白。換行被視為空白(Scanln,F(xiàn)scanln和Sscanln例外,這三個(gè)函數(shù)里換行符視為EOF)。 SkipSpace() // Token方法會在skipSpace為真時(shí)跳過輸入中的空白,并返回一個(gè)滿足f(c)的Unicode字符。如果f是nil,則使用!unicode.IsSpace(c)(即返回第一個(gè)非空格Unicode字符); // 即是說,本函數(shù)只對非空字符起效。換行符視為空白字符(Scanln,F(xiàn)scanln和Sscanln例外,這三個(gè)函數(shù)里換行符視為EOF)。 // 返回的切片類型指向共享的數(shù)據(jù),該數(shù)據(jù)可以被下一次Token的調(diào)用(使用ScanState接口作為輸入調(diào)用Scan函數(shù))中或者調(diào)用返回的Scan方法時(shí)重寫。 Token(skipSpace bool, f func(rune) bool) (token []byte, err error) // Width返回width選項(xiàng)的值以及其是否被設(shè)定。 Width() (wid int, ok bool) // 因?yàn)镽eadRune用接口實(shí)現(xiàn),Read方法應(yīng)該永遠(yuǎn)不被scan程序調(diào)用,一個(gè)好使的ScanState實(shí)現(xiàn)應(yīng)該保證總是從Read返回錯(cuò)誤。 Read(buf []byte) (n int, err error) } ScanState是一個(gè)交給用戶定制的Scanner接口的參數(shù)的接口。Scanner接口可能會進(jìn)行一次一個(gè)字符的掃描或者要求ScanState去探測下一個(gè)空白分隔的token。 type Scanner type Scanner interface { Scan(state ScanState, verb rune) error } 任何實(shí)現(xiàn)了Scan方法的對象都實(shí)現(xiàn)了Scanner接口,Scan方法會從輸入讀取數(shù)據(jù)并將處理結(jié)果存入接受端,接收端必須是有效的指針。Scan方法會被任何Scan、Scanf、Scanln等函數(shù)調(diào)用,只要對應(yīng)的參數(shù)實(shí)現(xiàn)了該方法。 type State type State interface { // Write可被調(diào)用以發(fā)出格式化的輸出。 Write(b []byte) (ret int, err error) // Width返回寬度的值及其是否被設(shè)定。 Width() (wid int, ok bool) // Precision返回精度的值及其是否被設(shè)定。 Precision() (prec int, ok bool) // Flag返回符號(正負(fù)號……)的值是否被設(shè)定。 Flag(c int) bool } State是一個(gè)提供給Formatter接口的輸出參數(shù)的接口。它提供對io.Writer接口的、使用提供的數(shù)據(jù)對參數(shù)格式化后的訪問。 type Stringer type Stringer interface { String() string } Stringer接口被任何實(shí)現(xiàn)了String方法的類型自動實(shí)現(xiàn),該方法定義了該類型的“原生”格式。String方法用來輸出參數(shù),當(dāng)使用%s或%v格式時(shí),或者被Print等不使用格式字符串的函數(shù)輸出時(shí)。 |
|
|