golang 中fmt用法
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
}
相關文章
- golang fmt 格式 “佔位符”Golang
- golang標準庫之 fmtGolang
- golang中channel的用法Golang
- 每日一個 Golang Packages 06/12 fmtGolangPackage
- Linux 的 fmt 命令用法與案例Linux
- Golang:從fmt.Scanf函式想到的Golang函式
- 淺談Golang中select的用法Golang
- 轉載golang中net/http包用法GolangHTTP
- 【go】golang中鎖的用法-互斥鎖Golang
- golang range的用法Golang
- golang的fmt包String(),Error(),Format(),GoString()的介面實現GolangErrorORM
- golang flag簡單用法Golang
- golang package time 用法詳解GolangPackage
- FMT/FWT學習筆記筆記
- 關於Golang struct{}{}用法和注意事項GolangStruct
- Golang筆記--strconv包的基本用法Golang筆記
- Go 中 ...用法Go
- golang中的介面Golang
- golang中的errgroupGolang
- golang 中的cronjobGolang
- golang 中的 cronjobGolang
- Golang | 簡介channel常見用法,完成goroutin通訊Golang
- 標準庫 fmt 包的基本使用
- JavaScript中prototype用法JavaScript
- js中的this用法JS
- php中split()用法PHP
- java中Varargs用法Java
- SQL 中With as 的用法SQL
- oracle中top用法Oracle
- Oracle中with的用法Oracle
- Oracle中group by用法Oracle
- MySQL 中 WITH ROLLUP 用法MySql
- Golang | 既是介面又是型別,interface是什麼神仙用法?Golang型別
- 伺服器開發利器 golang context 用法詳解伺服器GolangContext
- 『簡書API:jianshu 基於golang -- 用法介紹 (2)』APIGolang
- golang中的log庫Golang
- Golang中context使用GolangContext
- 【go】golang中的通道Golang