golang 中fmt用法

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。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
}





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.