Go常用標(biāo)準(zhǔn)庫之fmt的簡介與使用詳解
一、介紹
fmt 是 Go 語言中的一個常用標(biāo)準(zhǔn)庫,它用于格式化輸入和輸出數(shù)據(jù)。fmt 包提供了一系列函數(shù),可以幫助你將數(shù)據(jù)以特定的格式打印到標(biāo)準(zhǔn)輸出(通常是終端)或?qū)?shù)據(jù)格式化為字符串以供后續(xù)處理。這個庫的名稱 "fmt" 來自于 "format",因為它主要用于格式化數(shù)據(jù)。
fmt 包的主要功能包括:
- 格式化輸出:fmt 包提供了函數(shù)如
Print
,Printf
,Println
,Fprint
,Fprintf
, 和Fprintln
用于將數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出或指定的 io.Writer。你可以使用這些函數(shù)將數(shù)據(jù)以不同的格式打印到屏幕上或文件中。 - 格式化輸入:fmt 包也支持從輸入源(通常是標(biāo)準(zhǔn)輸入)讀取數(shù)據(jù),并根據(jù)格式規(guī)范解析數(shù)據(jù)。這是通過
Scan
,Scanf
, 和Scanln
函數(shù)實現(xiàn)的。這對于從用戶獲取輸入數(shù)據(jù)非常有用。 - 字符串格式化:你可以使用
Sprintf
函數(shù)將數(shù)據(jù)格式化為字符串而不是直接輸出到標(biāo)準(zhǔn)輸出,這對于構(gòu)建日志消息或其他需要格式化的字符串很有用。 - 錯誤格式化:fmt 包也提供了
Errorf
函數(shù),用于將格式化的錯誤消息作為 error 類型返回,方便錯誤處理。 - 格式化占位符:在格式化字符串中,你可以使用占位符來指定如何格式化數(shù)據(jù)。常見的占位符包括
%d
(整數(shù)),%f
(浮點數(shù)),%s
(字符串)等。
二、向外輸出
標(biāo)準(zhǔn)庫 fmt
提供了多種用于輸出的函數(shù),每個函數(shù)都有不同的用途和輸出方式。以下是一些常用的輸出相關(guān)函數(shù):
2.1 Print 系列
Print
:用于將文本輸出到標(biāo)準(zhǔn)輸出。它接受任意數(shù)量的參數(shù),并將它們串聯(lián)成一個字符串輸出,不會添加換行符。Printf
:用于格式化輸出到標(biāo)準(zhǔn)輸出。它接受一個格式化字符串和一系列參數(shù),根據(jù)格式化字符串的占位符將參數(shù)格式化并輸出。Println
:類似于Print
,但會在輸出后自動添加一個換行符。
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 main() { fmt.Print("Hello, ", "world") name := "Alice" age := 30 fmt.Printf("Hello, %s. You are %d years old.\n", name, age) fmt.Println("Hello, world") }
2.2 Fprint 系列
Fprint
系列函數(shù)用于將文本輸出到指定的 io.Writer
接口,而不僅僅是標(biāo)準(zhǔn)輸出。你可以將文本輸出到文件、網(wǎng)絡(luò)連接等。這些函數(shù)的參數(shù)列表包括一個 io.Writer
參數(shù),以及任意數(shù)量的參數(shù)。
Fprint
:將文本輸出到指定的io.Writer
。Fprintf
:將格式化文本輸出到指定的io.Writer
。Fprintln
:將帶有換行符的文本輸出到指定的io.Writer
。
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 main() { // 向標(biāo)準(zhǔn)輸出寫入內(nèi)容 fmt.Fprintln(os.Stdout, "向標(biāo)準(zhǔn)輸出寫入內(nèi)容") fileObj, err := os.OpenFile("./output.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { fmt.Println("打開文件出錯,err:", err) return } name := "jarvis" // 向打開的文件句柄中寫入內(nèi)容 fmt.Fprintf(fileObj, "往文件中寫如信息:%s", name) }
這個示例創(chuàng)建了一個名為 "output.txt" 的文件,并將數(shù)據(jù)寫入文件中。
2.3 Sprint 系列
Sprint
系列函數(shù)用于將文本輸出到字符串中,而不是標(biāo)準(zhǔn)輸出或文件。它們將文本格式化為字符串并返回結(jié)果。
Sprint
:將文本輸出到字符串。Sprintf
:將格式化文本輸出到字符串。Sprintln
:將帶有換行符的文本輸出到字符串。
func Sprint(a ...interface{}) string func Sprintf(format string, a ...interface{}) string func Sprintln(a ...interface{}) string
簡單的示例代碼如下:
func main() { s1 := fmt.Sprint("jarvis") name := "jarvis" age := 18 s2 := fmt.Sprintf("name:%s,age:%d", name, age) s3 := fmt.Sprintln("jarvis") fmt.Println(s1, s2, s3) }
2.4 Errorf 系列
Errorf
系列函數(shù)用于創(chuàng)建格式化的錯誤消息并返回一個 error
類型的值。這允許你將格式化的錯誤消息返回給調(diào)用者,以便更好地進(jìn)行錯誤處理。這些函數(shù)的用法類似于 Sprintf
,但它們返回一個 error
值而不是字符串。
Errorf
:根據(jù)format
參數(shù)生成格式化字符串并返回一個包含該字符串的錯誤。
func Errorf(format string, a ...interface{}) error
通常使用這種方式來自定義錯誤類型,例如:
err := fmt.Errorf("這是一個錯誤")
三、格式化占位符
*printf
系列函數(shù)都支持format格式化參數(shù),在這里我們按照占位符將被替換的變量類型劃分,方便查詢和記憶。
3.1 通用占位符
通用占位符用于格式化不同類型的數(shù)據(jù):
占位符 | 說明 |
---|---|
%v | 值的默認(rèn)格式表示 |
%+v | 類似%v,但輸出結(jié)構(gòu)體時會添加字段名 |
%#v | 值的Go語法表示 |
%T | 打印值的類型 |
%% | 百分號 |
代碼示例:
func main() { fmt.Printf("%v\n", 100) fmt.Printf("%v\n", false) o := struct{ name string }{"jarvis"} fmt.Printf("%v\n", o) fmt.Printf("%#v\n", o) fmt.Printf("%T\n", o) fmt.Printf("100%%\n") }
3.2 布爾型
占位符 | 說明 |
---|---|
%t | true或false |
3.3 整型
占位符 | 說明 |
---|---|
%b | 表示為二進(jìn)制 |
%c | 該值對應(yīng)的unicode碼值 |
%d | 表示為十進(jìn)制 |
%o | 表示為八進(jìn)制 |
%x | 表示為十六進(jìn)制,使用a-f |
%X | 表示為十六進(jìn)制,使用A-F |
%U | 表示為Unicode格式:U+1234,等價于"U+%04X" |
%q | 該值對應(yīng)的單引號括起來的go語法字符字面值,必要時會采用安全的轉(zhuǎn)義表示 |
示例代碼如下:
n := 65 fmt.Printf("%b\n", n) fmt.Printf("%c\n", n) fmt.Printf("%d\n", n) fmt.Printf("%o\n", n) fmt.Printf("%x\n", n) fmt.Printf("%X\n", n)
3.4 浮點數(shù)與復(fù)數(shù)
占位符 | 說明 |
---|---|
%b | 無小數(shù)部分、二進(jìn)制指數(shù)的科學(xué)計數(shù)法,如-123456p-78 |
%e | 科學(xué)計數(shù)法,如-1234.456e+78 |
%E | 科學(xué)計數(shù)法,如-1234.456E+78 |
%f | 有小數(shù)部分但無指數(shù)部分,如123.456 |
%F | 等價于%f |
%g | 根據(jù)實際情況采用%e或%f格式(以獲得更簡潔、準(zhǔn)確的輸出) |
%G | 根據(jù)實際情況采用%E或%F格式(以獲得更簡潔、準(zhǔn)確的輸出) |
示例代碼如下:
f := 12.34 fmt.Printf("%b\n", f) fmt.Printf("%e\n", f) fmt.Printf("%E\n", f) fmt.Printf("%f\n", f) fmt.Printf("%g\n", f) fmt.Printf("%G\n", f)
3.5 字符串和[]byte
占位符 | 說明 |
---|---|
%s | 直接輸出字符串或者[]byte |
%q | 該值對應(yīng)的雙引號括起來的go語法字符串字面值,必要時會采用安全的轉(zhuǎn)義表示 |
%x | 每個字節(jié)用兩字符十六進(jìn)制數(shù)表示(使用a-f |
%X | 每個字節(jié)用兩字符十六進(jìn)制數(shù)表示(使用A-F) |
示例代碼如下:
s := "jarvis" fmt.Printf("%s\n", s) fmt.Printf("%q\n", s) fmt.Printf("%x\n", s) fmt.Printf("%X\n", s)
3.6 指針
占位符 | 說明 |
---|---|
%p | 表示為十六進(jìn)制,并加上前導(dǎo)的0x |
示例代碼如下:
a := 18 fmt.Printf("%p\n", &a) fmt.Printf("%#p\n", &a)
3.7 寬度標(biāo)識符
寬度通過一個緊跟在百分號后面的十進(jìn)制數(shù)指定,如果未指定寬度,則表示值時除必需之外不作填充。精度通過(可選的)寬度后跟點號后跟的十進(jìn)制數(shù)指定。如果未指定精度,會使用默認(rèn)精度;如果點號后沒有跟數(shù)字,表示精度為0。舉例如下
占位符 | 說明 |
---|---|
%f | 默認(rèn)寬度,默認(rèn)精度 |
%9f | 寬度9,默認(rèn)精度 |
%.2f | 默認(rèn)寬度,精度2 |
%9.2f | 寬度9,精度2 |
%9.f | 寬度9,精度0 |
示例代碼如下:
n := 88.88 fmt.Printf("%f\n", n) fmt.Printf("%9f\n", n) fmt.Printf("%.2f\n", n) fmt.Printf("%9.2f\n", n) fmt.Printf("%9.f\n", n)
3.8 其他flag
占位符 | 說明 |
---|---|
‘+’ | 總是輸出數(shù)值的正負(fù)號;對%q(%+q)會生成全部是ASCII字符的輸出(通過轉(zhuǎn)義); |
’ ' | 對數(shù)值,正數(shù)前加空格而負(fù)數(shù)前加負(fù)號;對字符串采用%x或%X時(% x或% X)會給各打印的字節(jié)之間加空格 |
‘-’ | 在輸出右邊填充空白而不是默認(rèn)的左邊(即從默認(rèn)的右對齊切換為左對齊); |
‘#’ | 八進(jìn)制數(shù)前加0(%#o),十六進(jìn)制數(shù)前加0x(%#x)或0X(%#X),指針去掉前面的0x(%#p)對%q(%#q),對%U(%#U)會輸出空格和單引號括起來的go字面值; |
‘0’ | 使用0而不是空格填充,對于數(shù)值類型會把填充的0放在正負(fù)號后面; |
舉個例子:
s := "jarvis" fmt.Printf("%s\n", s) fmt.Printf("%5s\n", s) fmt.Printf("%-5s\n", s) fmt.Printf("%5.7s\n", s) fmt.Printf("%-5.7s\n", s) fmt.Printf("%5.2s\n", s) fmt.Printf("%05s\n", s)
四、獲取輸入
Go 語言的 fmt
包提供了 fmt.Scan
、fmt.Scanf
和 fmt.Scanln
這三個函數(shù),用于從標(biāo)準(zhǔn)輸入獲取用戶的輸入。這些函數(shù)允許你與用戶交互,從標(biāo)準(zhǔn)輸入流中讀取不同類型的數(shù)據(jù)并將其存儲在相應(yīng)的變量中。
4.1 fmt.Scan 函數(shù)
Scan
函數(shù)用于從標(biāo)準(zhǔn)輸入中獲取用戶的輸入,并將輸入的數(shù)據(jù)存儲在變量中。它根據(jù)空格分隔輸入,適合獲取多個輸入值。
函數(shù)定義如下:
func Scan(a ...interface{}) (n int, err error)
- Scan從標(biāo)準(zhǔn)輸入掃描文本,讀取由空白符分隔的值保存到傳遞給本函數(shù)的參數(shù)中,換行符視為空白符。
- 本函數(shù)返回成功掃描的數(shù)據(jù)個數(shù)和遇到的任何錯誤。如果讀取的數(shù)據(jù)個數(shù)比提供的參數(shù)少,會返回一個錯誤報告原因。
具體代碼示例如下:
package main import "fmt" func main() { var name string var age int fmt.Print("Enter your name: ") fmt.Scan(&name) fmt.Print("Enter your age: ") fmt.Scan(&age) fmt.Printf("Name: %s, Age: %d\n", name, age) }
在這個示例中,fmt.Scanf
使用格式字符串 %s %d
來解析輸入的姓名和年齡。
4.2 fmt.Scanln 函數(shù)
Scanln
函數(shù)用于從標(biāo)準(zhǔn)輸入中獲取用戶的輸入,并將輸入的數(shù)據(jù)存儲在變量中,每行一個變量。它通常用于獲取多個輸入值,每個值在單獨的行中輸入。
函數(shù)定義如下:
func Scanln(a ...interface{}) (n int, err error)
- Scanln類似Scan,它在遇到換行時才停止掃描。最后一個數(shù)據(jù)后面必須有換行或者到達(dá)結(jié)束位置。
- 本函數(shù)返回成功掃描的數(shù)據(jù)個數(shù)和遇到的任何錯誤。
代碼示例:
package main import "fmt" func main() { var name string var age int fmt.Print("Enter your name: ") fmt.Scanln(&name) fmt.Print("Enter your age: ") fmt.Scanln(&age) fmt.Printf("Name: %s, Age: %d\n", name, age) }
在上面的示例中,fmt.Scanln
用于獲取用戶輸入的姓名和年齡,并將它們存儲在相應(yīng)的變量中。輸入的每一行都對應(yīng)一個變量。
4.3 fmt.Scanf 函數(shù)
Scanf
函數(shù)用于根據(jù)格式規(guī)范解析輸入,并將數(shù)據(jù)存儲在變量中。它允許你指定輸入的格式,并可以處理不同類型的數(shù)據(jù)。
函數(shù)簽名如下:
func Scanf(format string, a ...interface{}) (n int, err error)
- Scanf從標(biāo)準(zhǔn)輸入掃描文本,根據(jù)format參數(shù)指定的格式去讀取由空白符分隔的值保存到傳遞給本函數(shù)的參數(shù)中。
- 本函數(shù)返回成功掃描的數(shù)據(jù)個數(shù)和遇到的任何錯誤。
代碼示例如下:
package main import "fmt" func main() { var name string var age int fmt.Print("Enter your name and age: ") fmt.Scanf("%s %d", &name, &age) fmt.Printf("Name: %s, Age: %d\n", name, age) }
在這個示例中,fmt.Scanf
使用格式字符串 %s %d
來解析輸入的姓名和年齡。
4.4 使用 bufio 包獲取輸入
bufio
包提供了一種更靈活的方式來處理輸入,特別是在需要完整讀取一行或多行輸入的情況下。你可以使用 bufio.NewReader
創(chuàng)建一個輸入緩沖區(qū),然后使用 ReadString
函數(shù)來讀取輸入,直到指定的分隔符(例如換行符 \n
)。這允許你獲取包含空格在內(nèi)的完整輸入內(nèi)容。
func bufioDemo() { reader := bufio.NewReader(os.Stdin) // 從標(biāo)準(zhǔn)輸入生成讀對象 fmt.Print("請輸入內(nèi)容:") text, _ := reader.ReadString('\n') // 讀取直到換行符 text = strings.TrimSpace(text) fmt.Printf("%#v\n", text) }
4.5 使用 Fscan 系列函數(shù)
Fscan
系列函數(shù)允許你從 io.Reader
接口中讀取數(shù)據(jù),而不僅僅是標(biāo)準(zhǔn)輸入。這些函數(shù)與 fmt.Scan
、fmt.Scanf
和 fmt.Scanln
類似,但允許你從任何實現(xiàn) io.Reader
接口的地方讀取數(shù)據(jù)。
Fscan
:從io.Reader
中讀取數(shù)據(jù)。Fscanln
:從io.Reader
中讀取一行數(shù)據(jù)。Fscanf
:根據(jù)指定的格式從io.Reader
中讀取數(shù)據(jù)。
func Fscan(r io.Reader, a ...interface{}) (n int, err error) func Fscanln(r io.Reader, a ...interface{}) (n int, err error) func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
代碼示例:
package main import ( "fmt" "strings" ) func main() { input := "42 John" reader := strings.NewReader(input) // 從字符串生成讀對象 var age int var name string n, err := fmt.Fscanf(reader, "%d %s", &age, &name) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Read %d values: Age: %d, Name: %s\n", n, age, name) }
4.6 使用 Sscan 系列函數(shù)
Sscan
系列函數(shù)允許你從字符串中讀取數(shù)據(jù),而不僅僅是從標(biāo)準(zhǔn)輸入。這些函數(shù)與 fmt.Scan
、fmt.Scanf
和 fmt.Scanln
類似,但允許你從字符串中讀取數(shù)據(jù)。
Sscan
:從字符串中讀取數(shù)據(jù)。Sscanln
:從字符串中讀取一行數(shù)據(jù)。Sscanf
:根據(jù)指定的格式從字符串中讀取數(shù)據(jù)。
func Sscan(str string, a ...interface{}) (n int, err error) func Sscanln(str string, a ...interface{}) (n int, err error) func Sscanf(str string, format string, a ...interface{}) (n int, err error)
代碼示例:
package main import ( "fmt" ) func main() { input := "Alice 30" var name string var age int n, err := fmt.Sscanf(input, "%s %d", &name, &age) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Read %d values: Name: %s, Age: %d\n", n, name, age) }
以上就是Go常用標(biāo)準(zhǔn)庫之fmt的簡介與使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Go fmt的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang微服務(wù)框架Kratos實現(xiàn)分布式任務(wù)隊列Asynq的方法詳解
任務(wù)隊列(Task Queue) 一般用于跨線程或跨計算機(jī)分配工作的一種機(jī)制,在Golang語言里面,我們有像Asynq和Machinery這樣的類似于Celery的分布式任務(wù)隊列,本文就給大家詳細(xì)介紹一下Golang微服務(wù)框架Kratos實現(xiàn)分布式任務(wù)隊列Asynq的方法,需要的朋友可以參考下2023-09-09一文帶你掌握Golang中panic與recover的使用方法
這篇文章主要介紹了Golang中panic與recover的作用和使用方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的小伙伴可以參考一下2023-04-04Golang中類型轉(zhuǎn)換利器cast庫的用法詳解
cast庫是一個簡潔而強(qiáng)大的第三方庫,它的主要功能是實現(xiàn)類型之間的安全轉(zhuǎn)換,而在Golang開發(fā)中,類型轉(zhuǎn)換是一個常見且不可避免的過程,下面我們就來看看cast庫在Golang中的具體應(yīng)用吧2024-11-11go redis實現(xiàn)滑動窗口限流的方式(redis版)
這篇文章主要介紹了go redis實現(xiàn)滑動窗口限流的方式(redis版),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12