Go語言的fmt包中文教程

jopen 12年前發布 | 174K 次閱讀 Go語言 Google Go/Golang開發

Fmt

import "fmt"

簡介 ?

Package fmt包含有格式化I/O函數,類似于C語言的printf和scanf。格式字符串的規則來源于C但更簡單一些。

輸出

格式:

一般:

%v   基本格式的值。當輸出結構體時,擴展標志(%+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   二進制表示

%c   數值對應的Unicode編碼字符

%d   十進制表示

%o   八進制表示

%q   單引號

%x   十六進制表示,使用a-f

%X   十六進制表示,使用A-F

%U   Unicode格式: U+1234,等價于"U+%04X"

浮點數:

%b   無小數部分、兩位指數的科學計數法,和strconv.FormatFloat的'b'轉換格式一致。舉例:-123456p-78

%e   科學計數法,舉例:-1234.456e+78

%E   科學計數法,舉例:-1234.456E+78

%f   有小數部分,但無指數部分,舉例:123.456

%g   根據實際情況采用%e或%f格式(以獲得更簡潔的輸出)

%G   根據實際情況采用%E或%f格式(以獲得更簡潔的輸出)

字符串和byte切片類型:

%s   直接輸出字符串或者[]byte

%q   雙引號括起來的字符串

%x   每個字節用兩字符十六進制數表示(使用小寫a-f)

%X   每個字節用兩字符十六進制數表示(使用大寫A-F)

指針:

%p   0x開頭的十六進制數表示

木有'u'標志。如果是無類型整數,自然會打印無類型格式。類似的,沒有必要去區分操作數的大小(int8, int64)。

寬度和精度格式化控制是指的Unicode編碼字符的數量(不同于C的printf,它的這兩個因子指的是字節的數量。)兩者均可以使用'*'號取代(任一個或兩個都),此時它們的值將被緊接著的參數控制,這個操作數必須是整型。

對于數字,寬度設置總長度,精度設置小數部分長度。例如,格式%6.2f 輸出123.45。

對于字符串,寬度是輸出字符數目的最低數量,如果不足會用空格填充。精度是輸出字符數目的最大數量,超過則會截斷。

其它符號:

+    總是輸出數值的正負號;對%q(%+q)將保證純ASCII碼輸出

-    用空格在右側填充空缺而不是默認的左側。

#    切換格式:在八進制前加0(%#o),十六進制前加0x(%#x)或0X(%#X);廢除指針的0x(%#p);

     對%q (%#q)如果可能的話輸出一個無修飾的字符串;

     對%U(%#U)如果對應數值是可打印字符輸出該字符。

' '  對數字(% d)空格會留一個空格在數字前并忽略數字的正負號;

     對切片和字符串(% x, % X)會以16進制輸出。

0    用前置0代替空格填補空缺。

每一個類似Printf的函數,都會有一個同樣的Print函數,此函數不需要format字符串,等價于對每一個參數設置為%v。另一個變體Println會在參數之間加上空格并在輸出結束后換行。

如果參數是一個接口值,將使用內在的具體實現的值,而不是接口本身,%v參數不會被使用。如下:

var i interface{} = 23

fmt.Printf("%v\n", i)

將輸出23。

如果參數實現了Formatter接口,該接口可用來更好的控制格式化。

如果格式(標志對Println等是隱含的%v)是專用于字符串的(%s %q %v %x %X),還提供了如下兩個規則:

1. 如果一個參數實現了error接口,Error方法會用來將目標轉化為字符串,隨后將被按給出的要求格式化。

2. 如果參數提供了String方法,這個方法將被用來將目標轉換為字符串,然后將按給出的格式標志格式化。

為了避免有可能的遞歸循環,例如:

type X string

func (x X) String() string { return Sprintf("<%s>", x) }

會在遞歸循環前轉換值:

func (x X) String() string { return Sprintf("<%s>", string(x)) }

錯誤的格式:

如果提供了一個錯誤的格式標志,例如給一個字符串提供了%d標志,生成的字符串將包含對該問題的描述,如下面的例子:

錯誤或未知的格式標志: %!verb(type=value)

     Printf("%d", hi):          %!d(string=hi)

太多參數: %!(EXTRA type=value)

     Printf("hi", "guys"):      hi%!(EXTRA string=guys)

缺少參數: %!verb(MISSING)

     Printf("hi%d"):            hi %!d(MISSING)

使用非整數提供寬度和精度: %!(BADWIDTH) or %!(BADPREC)

     Printf("%*s", 4.5, "hi"):  %!(BADWIDTH)hi

     Printf("%.*s", 4.5, "hi"): %!(BADPREC)hi

所有的錯誤都使用"%!"起始,(緊隨單字符的格式標志)以括號包圍的錯誤描述結束。

輸入

一系列類似的函數讀取格式化的文本,生成值。Scan,Scanf和Scanln從os.Stdin讀取;Fscan,Fscanf和Fscanln 從特定的io.Reader讀取;Sscan,Sscanf和Sscanln 從字符串讀取;Scanln,Fscanln和Sscanln在換行時結束讀取,并要求數據連續出現;Scanf,Fscanf和Sscanf會讀取一整行以匹配格式字符串;其他的函數將換行看著空格。

Scanf, Fscanf, and Sscanf根據格式字符串解析數據,類似于Printf。例如,%x將讀取一個十六進制數,%v將讀取值的默認表示。

格式行為類似于Printf,但有如下例外:

%p沒有提供

%T沒有提供

%e %E %f %F %g %G是等價的,都可以讀取任何浮點數或者復合數(非復數,指科學計數法表示的帶指數的數)

%s 和 %v字符串使用這兩個格式讀取時會因為空格而結束

不設格式或者使用%v讀取整數時,如果前綴為0(八進制)或0x(十六進制),將按對應進制讀取。

寬度在輸入中被解釋(%5s意思是最多從輸入讀取5個字符賦值給一個字符串),但輸入系列函數沒有解釋精度的語法(木有%5.2f,只有%5f)。

輸入系列函數中的格式字符串,所有非空的空白字符(除了換行符之外),無論在輸入里還是格式字符串里,都等價于1個空白字符。格式字符串必須匹配輸入的文本,如果不匹配將停止讀取數據并返回函數已經賦值的參數的數量。

所有的scan系列函數,如果參數包含Scan方法(或者說實現了Scanner接口),該參數將使用該方法讀取文本。另外,如果被填寫的參數的數量少于提供的參數的數量,將返回一個錯誤。

所有要被輸入的參數都應該是基礎類型或者實現了Scanner接口的數據類型的指針。

注意:Fscan等函數可以從輸入略過一些字符讀取需要的字符并返回,這就意味著一個循環的讀取程序可能會跳過輸入的部分數據。當數據間沒有空白時就會導致出現問題。如果讀取這提供給Fscan系列函數ReadRune 方法,這個方法可以用來讀取字符。如果讀取者還提供了UnreadRune 方法,該方法將被用來保存字符以使成功的調用不會丟失數據。為了給一個沒有這些功能的讀取者添加這倆方法,使用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

Package files

doc.go format.go print.go scan.go

func Errorf

func Errorf(format string, a ...interface{}) error

Errorf根據格式字符串和參數表生成一個字符串,該字符串滿足error接口。

func Fprint

func Fprint(w io.Writer, a ...interface{}) (n int, err error)

Fprint將所有參數都使用默認的格式寫入w。如果相鄰兩個參數都不是字符串時,會在參數間添加空白。函數返回寫入的字節數和任何遇到的錯誤。

func Fprintf

func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)

Fprintf根據格式字符串將參數寫入w。函數返回寫入的字節數和任何遇到的錯誤。

func Fprintln

func Fprintln(w io.Writer, a ...interface{}) (n int, err error)

Fprintln將所有參數都使用默認的格式寫入w并在最后添加換行。如果相鄰兩個參數都不是字符串時,會在參數間添加空白。函數返回寫入的字節數和任何遇到的錯誤。

func Fscan

func Fscan(r io.Reader, a ...interface{}) (n int, err error)

Fscan從r讀取文本,將連續的空白分割的數據存入連續的參數里。換行視同空白。它返回成功讀取的參數的數量。如果少于提供的參數的數量,返回值err將報告原因。

func Fscanf

func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)

Fscanf從r讀取文本,根據格式字符串順序將數據存入參數中。它返回成功解析并存入的參數的數量。

func Fscanln

func Fscanln(r io.Reader, a ...interface{}) (n int, err error)

Fscanln類似Fscanf,但會在換行符中止,并且存入最后一條后時讀取位置必須有換行或者結束符。

func Print

func Print(a ...interface{}) (n int, err error)

Print將所有參數都使用默認的格式寫入標準輸出。如果相鄰兩個參數都不是字符串時,會在參數間添加空白。函數返回寫入的字節數和任何遇到的錯誤。

func Printf

func Printf(format string, a ...interface{}) (n int, err error)

Printf根據格式字符串將參數寫入標準輸出。函數返回寫入的字節數和任何遇到的錯誤。

func Println

func Println(a ...interface{}) (n int, err error)

Println將所有參數都使用默認的格式寫入標準輸出并在最后添加換行。如果相鄰兩個參數均非字符串時,會在參數間添加空白。函數返回寫入的字節數和任何遇到的錯誤。

func Scan

func Scan(a ...interface{}) (n int, err error)

Scan從標準輸入讀取文本,將空白分割的連續數據順序存入參數里。換行視同空白。它返回成功讀取的參數的數量。如果少于提供的參數的數量,返回值err將報告原因。

func Scanf

func Scanf(format string, a ...interface{}) (n int, err error)

Scanf從標準輸入讀取文本,根據格式字符串順序將數據存入參數中。它返回成功解析并存入的參數的數量。

func Scanln

func Scanln(a ...interface{}) (n int, err error)

Scanln類似Scan,但會在換行符中止,并且存入最后一條后時讀取位置必須有換行或者結束符。

func Sprint

func Sprint(a ...interface{}) string

Sprint將所有參數都使用默認的格式寫入并生成一個字符串。如果相鄰兩個參數都不是字符串時,會在參數間添加空白。

func Sprintf

func Sprintf(format string, a ...interface{}) string

Sprintf根據格式字符串將參數寫入并返回生成的字符串。

func Sprintln

func Sprintln(a ...interface{}) string

Sprintln將所有參數都使用默認的格式寫入并生成一個字符串。如果相鄰兩個參數都不是字符串時,會在參數間添加空白。字符串最后會添加換行符。

func Sscan

func Sscan(str string, a ...interface{}) (n int, err error)

Sscan從字符串讀取文本,將空白分割的連續數據順序存入參數里。換行視同空白。它返回成功讀取的參數的數量。如果少于提供的參數的數量,返回值err將報告原因。

func Sscanf

func Sscanf(str string, format string, a ...interface{}) (n int, err error)

Scanf從字符串讀取文本,根據格式字符串順序將數據存入參數中。它返回成功解析并存入的參數的數量。

func Sscanln

func Sscanln(str string, a ...interface{}) (n int, err error)

Sscanln類似Sscan,但會在換行符中止,并且存入最后一條后時讀取位置必須有換行或者結束符。

type Formatter

type Formatter interface {

    Format(f State, c rune)

}

Formatter是一個供用戶定制的格式化接口。Format方法的實現可能需要調用Sprintf 或Fprintf(f)等函數來生成輸出。

type GoStringer

type GoStringer interface {

    GoString() string

}

GoStringer接口由任意包含GoString方法的數據實現,這個方法定義了數據的Go語法格式。GoString方法用來在使用%#v格式標志時輸出值。

type ScanState

type ScanState interface {

    // ReadRune函數從輸入讀取下一個Unicode符號。如果在Scanln,Fscanln或Sscanln中調用,本函數會在讀取到第一個'\n'或達到最大寬度時返回EOF。

    ReadRune() (r rune, size int, err error)

    // UnreadRune會讓ReadRune的下一次調用返回同一個字符。

    UnreadRune() error

    // SkipSpace跳過輸入的空白。換行被視為空白(Scanln,Fscanln和Sscanln例外,這三個函數里換行符視為EOF)。

    SkipSpace()

    // Token方法會在skipSpace為真時跳過輸入中的空白,并返回一個滿足f(c)的Unicode字符。如果f是nil,則使用!unicode.IsSpace(c)(即返回第一個非空格Unicode字符);

    // 即是說,本函數只對非空字符起效。換行符視為空白字符(Scanln,Fscanln和Sscanln例外,這三個函數里換行符視為EOF)。

    // 返回的切片類型指向共享的數據,該數據可以被下一次Token的調用(使用ScanState接口作為輸入調用Scan函數)中或者調用返回的Scan方法時重寫。

    Token(skipSpace bool, f func(rune) bool) (token []byte, err error)

    // Width返回width選項的值以及其是否被設定。

    Width() (wid int, ok bool)

    // 因為ReadRune用接口實現,Read方法應該永遠不被scan程序調用,一個好使的ScanState實現應該保證總是從Read返回錯誤。

    Read(buf []byte) (n int, err error)

}

ScanState是一個交給用戶定制的Scanner接口的參數的接口。Scanner接口可能會進行一次一個字符的掃描或者要求ScanState去探測下一個空白分隔的token。

type Scanner

type Scanner interface {

    Scan(state ScanState, verb rune) error

}

任何實現了Scan方法的對象都實現了Scanner接口,Scan方法會從輸入讀取數據并將處理結果存入接受端,接收端必須是有效的指針。Scan方法會被任何Scan、Scanf、Scanln等函數調用,只要對應的參數實現了該方法。

type State

type State interface {

    // Write可被調用以發出格式化的輸出。

    Write(b []byte) (ret int, err error)

    // Width返回寬度的值及其是否被設定。

    Width() (wid int, ok bool)

    // Precision返回精度的值及其是否被設定。

    Precision() (prec int, ok bool)

    // Flag返回符號(正負號……)的值是否被設定。

    Flag(c int) bool

}

State是一個提供給Formatter接口的輸出參數的接口。它提供對io.Writer接口的、使用提供的數據對參數格式化后的訪問。

type Stringer

type Stringer interface {

    String() string

}

Stringer接口被任何實現了String方法的類型自動實現,該方法定義了該類型的“原生”格式。String方法用來輸出參數,當使用%s或%v格式時,或者被Print等不使用格式字符串的函數輸出時。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!