Go語言fmt庫詳解與應(yīng)用實例(格式化輸入輸出功能)
Go語言fmt庫詳解與應(yīng)用實例
在Go語言中,fmt
庫是一個非常重要的標準庫,它提供了格式化輸入和輸出的功能。在本篇博客中,我們將深入探討fmt
庫的各種功能,并通過實例演示如何使用這些功能。
1. 格式化輸出
fmt
庫最基本的功能之一就是格式化輸出。通過Print
、Printf
和Println
函數(shù),我們可以將數(shù)據(jù)以特定格式打印到標準輸出。
package main import "fmt" func main() { name := "Alice" age := 30 // Print輸出 fmt.Print("Name: ", name) fmt.Print(", Age: ", age) // Printf輸出 fmt.Printf("\nName: %s, Age: %d\n", name, age) // Println輸出 fmt.Println("Name:", name, ", Age:", age) }
上述代碼演示了Print
、Printf
和Println
的用法。Print
用于簡單輸出,Printf
用于格式化輸出,而Println
在輸出后會添加換行符。
2. 格式化輸入
fmt
庫還提供了用于格式化輸入的函數(shù),其中最常用的是Scan
和Scanf
。
package main import "fmt" func main() { var name string var age int // 輸入字符串和整數(shù) 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) }
這段代碼演示了如何使用Scan
和Scanf
從標準輸入讀取用戶輸入。用戶被提示輸入名字和年齡,然后程序?qū)⑦@些值存儲在相應(yīng)的變量中并進行輸出。
3. 字符串格式化
fmt
庫支持通過Sprintf
函數(shù)將格式化的文本保存到字符串中,而不是直接輸出。
package main import "fmt" func main() { name := "Bob" age := 25 formattedString := fmt.Sprintf("Name: %s, Age: %d", name, age) fmt.Println(formattedString) }
上述代碼中,Sprintf
函數(shù)將格式化后的字符串保存到formattedString
變量中,然后通過Println
函數(shù)輸出。
4. 格式化控制符
在Printf
和相關(guān)函數(shù)中,我們使用格式化控制符指定輸出的格式。例如,%s
用于字符串,%d
用于整數(shù),%f
用于浮點數(shù)等。
package main import "fmt" func main() { name := "Charlie" age := 28 height := 175.5 fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height) }
上述代碼中,%.2f
表示浮點數(shù)保留兩位小數(shù)。格式化控制符的靈活使用使得我們可以根據(jù)需要調(diào)整輸出的樣式。
結(jié)語
fmt
庫是Go語言中一個強大而靈活的庫,提供了豐富的格式化輸入輸出功能。通過本文的介紹和實例演示,相信你對fmt
庫的使用有了更深的理解。在實際開發(fā)中,合理運用這些功能可以使代碼更具可讀性和可維護性。希望本文對你在Go語言編程中的工作有所幫助。
擴展:
Go 常用標準庫之 fmt 介紹與基本使用
一、介紹
fmt 是 Go 語言中的一個常用標準庫,它用于格式化輸入和輸出數(shù)據(jù)。fmt 包提供了一系列函數(shù),可以幫助你將數(shù)據(jù)以特定的格式打印到標準輸出(通常是終端)或?qū)?shù)據(jù)格式化為字符串以供后續(xù)處理。這個庫的名稱 "fmt" 來自于 "format",因為它主要用于格式化數(shù)據(jù)。
fmt 包的主要功能包括:
- 格式化輸出:fmt 包提供了函數(shù)如
Print
,Printf
,Println
,Fprint
,Fprintf
, 和Fprintln
用于將數(shù)據(jù)輸出到標準輸出或指定的 io.Writer。你可以使用這些函數(shù)將數(shù)據(jù)以不同的格式打印到屏幕上或文件中。 - 格式化輸入:fmt 包也支持從輸入源(通常是標準輸入)讀取數(shù)據(jù),并根據(jù)格式規(guī)范解析數(shù)據(jù)。這是通過
Scan
,Scanf
, 和Scanln
函數(shù)實現(xiàn)的。這對于從用戶獲取輸入數(shù)據(jù)非常有用。 - 字符串格式化:你可以使用
Sprintf
函數(shù)將數(shù)據(jù)格式化為字符串而不是直接輸出到標準輸出,這對于構(gòu)建日志消息或其他需要格式化的字符串很有用。 - 錯誤格式化:fmt 包也提供了
Errorf
函數(shù),用于將格式化的錯誤消息作為 error 類型返回,方便錯誤處理。 - 格式化占位符:在格式化字符串中,你可以使用占位符來指定如何格式化數(shù)據(jù)。常見的占位符包括
%d
(整數(shù)),%f
(浮點數(shù)),%s
(字符串)等。
二、向外輸出
標準庫 fmt
提供了多種用于輸出的函數(shù),每個函數(shù)都有不同的用途和輸出方式。以下是一些常用的輸出相關(guān)函數(shù):
2.1 Print 系列
Print
:用于將文本輸出到標準輸出。它接受任意數(shù)量的參數(shù),并將它們串聯(lián)成一個字符串輸出,不會添加換行符。Printf
:用于格式化輸出到標準輸出。它接受一個格式化字符串和一系列參數(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
接口,而不僅僅是標準輸出。你可以將文本輸出到文件、網(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() { // 向標準輸出寫入內(nèi)容 fmt.Fprintln(os.Stdout, "向標準輸出寫入內(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ù)用于將文本輸出到字符串中,而不是標準輸出或文件。它們將文本格式化為字符串并返回結(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)用者,以便更好地進行錯誤處理。這些函數(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 | 值的默認格式表示 |
%+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 | 表示為二進制 |
%c | 該值對應(yīng)的unicode碼值 |
%d | 表示為十進制 |
%o | 表示為八進制 |
%x | 表示為十六進制,使用a-f |
%X | 表示為十六進制,使用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ù)部分、二進制指數(shù)的科學計數(shù)法,如-123456p-78 |
%e | 科學計數(shù)法,如-1234.456e+78 |
%E | 科學計數(shù)法,如-1234.456E+78 |
%f | 有小數(shù)部分但無指數(shù)部分,如123.456 |
%F | 等價于%f |
%g | 根據(jù)實際情況采用%e或%f格式(以獲得更簡潔、準確的輸出) |
%G | 根據(jù)實際情況采用%E或%F格式(以獲得更簡潔、準確的輸出) |
示例代碼如下:
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é)用兩字符十六進制數(shù)表示(使用a-f |
%X | 每個字節(jié)用兩字符十六進制數(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 | 表示為十六進制,并加上前導的0x |
示例代碼如下:
a := 18 fmt.Printf("%p\n", &a) fmt.Printf("%#p\n", &a)
3.7 寬度標識符
寬度通過一個緊跟在百分號后面的十進制數(shù)指定,如果未指定寬度,則表示值時除必需之外不作填充。精度通過(可選的)寬度后跟點號后跟的十進制數(shù)指定。如果未指定精度,會使用默認精度;如果點號后沒有跟數(shù)字,表示精度為0。舉例如下
占位符 | 說明 |
---|---|
%f | 默認寬度,默認精度 |
%9f | 寬度9,默認精度 |
%.2f | 默認寬度,精度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ù)值的正負號;對%q(%+q)會生成全部是ASCII字符的輸出(通過轉(zhuǎn)義); |
’ ' | 對數(shù)值,正數(shù)前加空格而負數(shù)前加負號;對字符串采用%x或%X時(% x或% X)會給各打印的字節(jié)之間加空格 |
‘-’ | 在輸出右邊填充空白而不是默認的左邊(即從默認的右對齊切換為左對齊); |
‘#’ | 八進制數(shù)前加0(%#o),十六進制數(shù)前加0x(%#x)或0X(%#X),指針去掉前面的0x(%#p)對%q(%#q),對%U(%#U)會輸出空格和單引號括起來的go字面值; |
‘0’ | 使用0而不是空格填充,對于數(shù)值類型會把填充的0放在正負號后面; |
舉個例子:
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ù),用于從標準輸入獲取用戶的輸入。這些函數(shù)允許你與用戶交互,從標準輸入流中讀取不同類型的數(shù)據(jù)并將其存儲在相應(yīng)的變量中。
4.1 fmt.Scan 函數(shù)
Scan
函數(shù)用于從標準輸入中獲取用戶的輸入,并將輸入的數(shù)據(jù)存儲在變量中。它根據(jù)空格分隔輸入,適合獲取多個輸入值。
函數(shù)定義如下:
func Scan(a ...interface{}) (n int, err error)
- Scan從標準輸入掃描文本,讀取由空白符分隔的值保存到傳遞給本函數(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ù)用于從標準輸入中獲取用戶的輸入,并將輸入的數(shù)據(jù)存儲在變量中,每行一個變量。它通常用于獲取多個輸入值,每個值在單獨的行中輸入。
函數(shù)定義如下:
func Scanln(a ...interface{}) (n int, err error)
- Scanln類似Scan,它在遇到換行時才停止掃描。最后一個數(shù)據(jù)后面必須有換行或者到達結(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從標準輸入掃描文本,根據(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) // 從標準輸入生成讀對象 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ù),而不僅僅是標準輸入。這些函數(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ù),而不僅僅是從標準輸入。這些函數(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) }
到此這篇關(guān)于Go語言fmt庫詳解與應(yīng)用實例(格式化輸入輸出功能)的文章就介紹到這了,更多相關(guān)Go fmt 庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go?函數(shù)中獲取調(diào)用者的函數(shù)名和文件名及行號
這篇文章主要介紹了Go?函數(shù)中獲取調(diào)用者的函數(shù)名和文件名及行號,文章圍主題詳細內(nèi)容展開相關(guān)介紹,感興趣的小伙伴可以參考一下2022-05-05Golang中實現(xiàn)類似類與繼承的方法(示例代碼)
這篇文章主要介紹了Golang中實現(xiàn)類似類與繼承的方法,Go語言中通過方法接受者的類型來決定方法的歸屬和繼承關(guān)系,本文通過示例代碼講解的非常詳細,需要的朋友可以參考下2024-04-04Go語言循環(huán)遍歷含有中文的字符串的方法小結(jié)
這篇文章主要介紹了Go語言循環(huán)遍歷含有中文的字符串的幾種方法,文章通過代碼示例講解的非常詳細,具有一定的參考價值,感興趣的小伙伴跟著小編一起來看看吧2023-07-07Golang程序中使用Prometheus的client_golang庫
這篇文章主要介紹了Golang程序中使用Prometheus的client_golang庫,Prometheus 是一個開源的監(jiān)控和警報工具包,用于收集和處理應(yīng)用程序和系統(tǒng)的指標數(shù)據(jù)。Prometheus 提供了多種客戶端庫,可以輕松地集成到各種編程語言中2023-04-04