golang 中fmt用法

hongmingover發表於2018-09-18

golang 中fmt用法

chenbaoke · 2014-10-10 15:00:01 · 47888 次點選 · 預計閱讀時間 8 分鐘 · 2分鐘之前 開始瀏覽    

這是一個建立於 2014-10-10 15:00:01 的文章,其中的資訊可能已經有所發展或是發生改變。

fmt 包中的函式和方法



本文轉自Golang學習-fmt包:
http://www.cnblogs.com/golove/p/3286303.html



// format.go

------------------------------------------------------------

// Fprintf 將引數列表 a 填寫到格式字串 format 的佔位符中
// 並將填寫後的結果寫入 w 中,返回寫入的位元組數
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)

// Printf 將引數列表 a 填寫到格式字串 format 的佔位符中
// 並將填寫後的結果寫入 os.Stdout 中,返回寫入的位元組數
func Printf(format string, a ...interface{}) (n int, err error)

// Sprintf 將引數列表 a 填寫到格式字串 format 的佔位符中
// 返回填寫後的結果
func Sprintf(format string, a ...interface{}) string

// Errorf 將引數列表 a 填寫到格式字串 format 的佔位符中
// 並將填寫後的結果轉換為 error 型別返回
func Errorf(format string, a ...interface{}) error

------------------------------------------------------------

// Fprint 將引數列表 a 中的各個引數轉換為字串格式並寫入到 w 中
// 各個引數之間以空格分隔,返回寫入的位元組數
func Fprint(w io.Writer, a ...interface{}) (n int, err error)

// Print 將引數列表 a 中的各個引數轉換為字串格式並寫入到 os.Stdout 中
// 各個引數之間以空格分隔,返回寫入的位元組數
func Print(a ...interface{}) (n int, err error)

// Sprint 將引數列表 a 中的各個引數轉換為字串格式並返回
// 各個引數之間以空格分隔
func Sprint(a ...interface{}) string

------------------------------------------------------------

// Fprintln 在 Fprint 的基礎上,再向 w 中寫入一個換行符
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)

// Println 在 Print 的基礎上,再向 os.Stdout 中寫入一個換行符
func Println(a ...interface{}) (n int, err error)

// Sprintln 在 Sprint 的基礎上,在返回值的最後新增一個換行符
func Sprintln(a ...interface{}) string

------------------------------------------------------------

// 示例
func main() {
fmt.Fprintf(os.Stdout, "%08b\n", 32) // 00100000
fmt.Printf("%08b\n", 32) // 00100000
fmt.Print(fmt.Sprintf("%08b\n", 32)) // 00100000
fmt.Print(fmt.Errorf("%08b\n", 32)) // 00100000

fmt.Fprint(os.Stdout, "A")
fmt.Print("B")
fmt.Print(fmt.Sprint("C"))
// ABC

fmt.Print("\n")

fmt.Fprintln(os.Stdout, "A") // A
fmt.Println("B") // B
fmt.Print(fmt.Sprintln("C")) // C
}

------------------------------------------------------------

// Formatter 用於實現物件的自定義格式輸出
type Formatter interface {
// Format 用來處理當物件遇到 c 標記時的輸出方式(c 相當於 %s 中的 s)
// f 用來獲取佔位符的寬度、精度、擴充套件標記等資訊,同時實現最終的輸出
// c 是要處理的標記
Format(f State, c rune)
}

// State 用來獲取佔位符的狀態,包括寬度、精度、擴充套件標記等資訊
// 同時實現格式化後的字串的輸出
type State interface {
// Write 用於將格式化後的字串輸出到指定的物件
// 根據 Print 函式(Fprintf,Printf,Sprintf)的不同,輸出到不同的地方
Write(b []byte) (ret int, err error)
// Width 返回佔位符的寬度值(wid)和寬度是否被設定(ok)
Width() (wid int, ok bool)
// Precision 返回佔位符的精度值(prec)和精度是否被設定(ok)
Precision() (prec int, ok bool)
// Flag 返回擴充套件標記 c(一個字元,比如 %#s 中的 #)是否已被設定
Flag(c int) bool
}

type Stringer interface {
// String 獲取物件的文字形式
String() string
}

type GoStringer interface {
// GoString 獲取物件的 Go 語法文字形式(以 %#v 格式輸出的文字)
GoString() string
}

------------------------------------------------------------

// 示例
type Ustr string

func (us Ustr) String() string {
return string(us) + " 自定義格式"
}

func (us Ustr) GoString() string {
return string(us) + " Go 格式"
}

func (us Ustr) Format(f fmt.State, c rune) {
switch c {
case 'm', 'M':
f.Write([]byte(us + "\n擴充套件標記:["))
if f.Flag('-') {
f.Write([]byte(" -"))
}
if f.Flag('+') {
f.Write([]byte(" +"))
}
if f.Flag('#') {
f.Write([]byte(" #"))
}
if f.Flag(' ') {
f.Write([]byte(" space"))
}
if f.Flag('0') {
f.Write([]byte(" 0"))
}
f.Write([]byte(" ]\n"))
if w, wok := f.Width(); wok {
f.Write([]byte("寬度值:" + fmt.Sprint(w) + "\n"))
}
if p, pok := f.Precision(); pok {
f.Write([]byte("精度值:" + fmt.Sprint(p)))
}
case 'v': // 如果使用 Format 函式,則必須自己處理所有格式,包括 %#v
if f.Flag('#') {
f.Write([]byte(us.GoString()))
} else {
f.Write([]byte(us.String()))
}
default: // 如果使用 Format 函式,則必須自己處理預設輸出
f.Write([]byte(us.String()))
}
}

func main() {
us := Ustr("Hello World!")
fmt.Printf("% 0-+#8.5m\n", us)
// Hello World!
// 擴充套件標記:[ - + # space 0 ]
// 寬度值:8
// 精度值:5
fmt.Println(us)
// Hello World! 自定義格式
fmt.Printf("%#v\n", us)
// Hello World! Go 格式
}



============================================================



// scan.go

------------------------------------------------------------

// Fscanf 用於掃描 r 中的資料,並根據 format 指定的格式
// 將掃描出的資料填寫到引數列表 a 中
// 當 r 中的資料被全部掃描完畢或掃描長度超出 format 指定的長度時
// 則停止掃描(換行符會被當作空格處理)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)

func main() {
s := strings.NewReader("我的名字叫 Golang ,今年 4 歲")
var name string
var age int
// 注意:這裡必須傳遞指標 &name, &age
// 要獲取的資料前後必須有空格
fmt.Fscanf(s, "我的名字叫 %s ,今年 %d 歲", &name, &age)
fmt.Printf("%s %d", name, age)
// Golang 4
}

// Scanf 用於掃描 os.Stdin 中的資料,並根據 format 指定的格式
// 將掃描出的資料填寫到引數列表 a 中
// 當 r 中的資料被全部掃描完畢或者掃描長度超出 format 指定的長度時
// 則停止掃描(換行符會被當作空格處理)
func Scanf(format string, a ...interface{}) (n int, err error)

func main() {
var name string
var age int
// 注意:這裡必須傳遞指標 &name, &age
// 要獲取的資料前後必須有空格
fmt.Scanf("%s %d", &name, &age)
// 在控制檯輸入:Golang 4
fmt.Printf("我的名字叫 %s ,今年 %d 歲", name, age)
// 我的名字叫 Golang ,今年 4 歲
}

// Sscanf 用於掃描 str 中的資料,並根據 format 指定的格式
// 將掃描出的資料填寫到引數列表 a 中
// 當 r 中的資料被全部掃描完畢或者掃描長度超出 format 指定的長度時
// 則停止掃描(換行符會被當作空格處理)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)

func main() {
s := "我的名字叫 Golang ,今年 4 歲"
var name string
var age int
// 注意:這裡必須傳遞指標 &name, &age
// 要獲取的資料前後必須有空格
fmt.Sscanf(s, "我的名字叫 %s ,今年 %d 歲", &name, &age)
fmt.Printf("%s %d", name, age)
// Golang 4
}

------------------------------------------------------------

// Fscan 用於掃描 r 中的資料,並將資料以空格為分割符進行分割
// 然後填寫到引數列表 a 中
// 當 r 中的資料被全部掃描完畢或者引數列表 a 被全部填寫完畢
// 則停止掃描(換行符會被當作空格處理)
func Fscan(r io.Reader, a ...interface{}) (n int, err error)

// Scan 用於掃描 os.Stdin 中的資料,並將資料以空格為分割符進行分割
// 然後填寫到引數列表 a 中
// 當 r 中的資料被全部掃描完畢或者引數列表 a 被全部填寫完畢
// 則停止掃描(換行符會被當作空格處理)
func Scan(a ...interface{}) (n int, err error)

// Sscan 用於掃描 str 中的資料,並將資料以空格為分割符進行分割
// 然後填寫到引數列表 a 中
// 當 r 中的資料被全部掃描完畢或者引數列表 a 被全部填寫完畢
// 則停止掃描(換行符會被當作空格處理)
func Sscan(str string, a ...interface{}) (n int, err error)

------------------------------------------------------------

// Fscanln 用於掃描 r 中的資料,並將資料以空格為分割符進行分割
// 然後填寫到引數列表 a 中
// 當掃描過程中遇到 '\n' 或者引數列表 a 被全部填寫完畢
// 則停止掃描
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)

// Scanln 用於掃描 os.Stdin 中的資料,並將資料以空格為分割符進行分割
// 然後填寫到引數列表 a 中
// 當掃描過程中遇到 '\n' 或者引數列表 a 被全部填寫完畢
// 則停止掃描
func Scanln(a ...interface{}) (n int, err error)

// Sscanln 用於掃描 str 中的資料,並將資料以空格為分割符進行分割
// 然後填寫到引數列表 a 中
// 當掃描過程中遇到 '\n' 或者引數列表 a 被全部填寫完畢
// 則停止掃描
func Sscanln(str string, a ...interface{}) (n int, err error)

------------------------------------------------------------

// ScanState 會返回掃描狀態給自定義的 Scanner
// Scanner 可能會做字元的實時掃描
// 或者通過 ScanState 獲取以空格分割的 token
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
// 在其它 Scan 操作中,換行符會被當作空格
SkipSpace()
// 如果引數 skipSpace 為 true,則 Token 會跳過輸入資料中的空格
// 然後返回滿足函式 f 的連續字元,如果 f 為 nil,則使用 !unicode.IsSpace 來代替 f
// 在 Scanln、Fscanln、Sscanln 操作中,換行符會被當作 EOF
// 在其它 Scan 操作中,換行符會被當作空格
// 返回的 token 是一個切片,返回的資料可能在下一次呼叫 Token 的時候被修改
Token(skipSpace bool, f func(rune) bool) (token []byte, err error)
// Width 返回寬度值以及寬度值是否被設定
Width() (wid int, ok bool)
// 因為 ReadRune 已經通過介面實現,所以 Read 可能永遠不會被 Scan 例程呼叫
// 一個 ScanState 的實現,可能會選擇廢棄 Read 方法,而使其始終返回一個錯誤資訊
Read(buf []byte) (n int, err error)
}

// Scanner 用於實現物件的自定義格式掃描
type Scanner interface {
// Scan 用來處理當物件遇到 c 標記時的掃描方式(c 相當於 %s 中的 s)
// state 用來處理掃描狀態
// c 是要處理的標記
Scan(state ScanState, verb rune) error
}

相關文章