Go語(yǔ)言fmt包的具體使用
在Go語(yǔ)言中,fmt
包是一個(gè)非常常用的包,它提供了豐富的格式化輸入輸出功能,使得數(shù)據(jù)的輸入輸出變得更加靈活和便捷。本文將詳細(xì)介紹fmt
包的常用函數(shù)及其用法,幫助你更好地理解和使用這個(gè)強(qiáng)大的工具。
一、向外輸出
Print系列函數(shù)
fmt
包提供了Print
、Printf
和Println
三個(gè)函數(shù),用于向標(biāo)準(zhǔn)輸出(通常是控制臺(tái))打印內(nèi)容。
Print
函數(shù)直接輸出內(nèi)容,不添加任何修飾。Printf
函數(shù)支持格式化輸出字符串,可以根據(jù)指定的格式化字符串來(lái)格式化輸出。Println
函數(shù)在輸出內(nèi)容的結(jié)尾添加一個(gè)換行符(\n),并且會(huì)在各個(gè)元素之間添加空格。
函數(shù)簽名如下:
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)
參數(shù)說(shuō)明:
a
:Print
和Println
函數(shù)接受一個(gè)或多個(gè)interface{}
類(lèi)型的值作為參數(shù),這些值將被格式化為字符串并輸出。format
:Printf
函數(shù)的格式化字符串,其中可以包含占位符(如%d
、%s
等)來(lái)指定如何格式化參數(shù)。
返回值:
n
:表示成功寫(xiě)入的字節(jié)數(shù)。err
:如果發(fā)生錯(cuò)誤,則返回錯(cuò)誤信息,否則為nil
。
適用場(chǎng)景:
- 當(dāng)需要快速輸出調(diào)試信息或簡(jiǎn)單的內(nèi)容時(shí),可以使用
Print
或Println
函數(shù)。 - 當(dāng)需要對(duì)輸出的內(nèi)容進(jìn)行格式化控制時(shí),
Printf
函數(shù)是一個(gè)很好的選擇。
示例代碼:
package main import "fmt" func main() { fmt.Print("Hello, World!") // 輸出:Hello, World! fmt.Printf("Name: %s, Age: %d", "Alice", 25) // 輸出:Name: Alice, Age: 25 fmt.Println("Hello, World!") // 輸出:Hello, World!(帶換行) }
Fprint系列函數(shù)
Fprint
系列函數(shù)會(huì)將內(nèi)容輸出到一個(gè)io.Writer
接口類(lèi)型的變量w
中,通常用于往文件中寫(xiě)入內(nèi)容。
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)
參數(shù)說(shuō)明:
w
:一個(gè)實(shí)現(xiàn)了io.Writer
接口的對(duì)象,表示輸出流。常見(jiàn)的io.Writer
包括os.Stdout
(標(biāo)準(zhǔn)輸出)、os.Stderr
(標(biāo)準(zhǔn)錯(cuò)誤)以及文件對(duì)象等。a
:要格式化并寫(xiě)入的值列表。format
:格式化字符串,其中可以包含占位符來(lái)指定如何格式化參數(shù)。
返回值:
n
:寫(xiě)入的字節(jié)數(shù)。err
:如果發(fā)生錯(cuò)誤,則返回錯(cuò)誤信息,否則為nil
。
適用場(chǎng)景:
- 當(dāng)需要將內(nèi)容寫(xiě)入到文件或其他輸出流時(shí),
Fprint
系列函數(shù)非常有用。
示例代碼:
package main import ( "fmt" "os" ) func main() { // 將輸出寫(xiě)入到標(biāo)準(zhǔn)輸出 n, err := fmt.Fprint(os.Stdout, "Hello, World!") if err != nil { fmt.Println("Error:", err) return } fmt.Println("\nWritten", n, "bytes") // 將輸出寫(xiě)入到文件 file, err := os.Create("output.txt") if err != nil { fmt.Println("Error creating file:", err) return } defer file.Close() n, err = fmt.Fprint(file, "This is written to a file.") if err != nil { fmt.Println("Error writing to file:", err) return } fmt.Println("Written", n, "bytes to file") }
Sprint系列函數(shù)
Sprint
系列函數(shù)會(huì)把傳入的數(shù)據(jù)生成并返回一個(gè)字符串,用于將一組值格式化為字符串。與Printf
類(lèi)似,但它不輸出到任何地方,而是將結(jié)果作為字符串返回。
func Sprint(a ...interface{}) string func Sprintf(format string, a ...interface{}) string func Sprintln(a ...interface{}) string
參數(shù)說(shuō)明:
a
:要格式化并轉(zhuǎn)換為字符串的值列表。format
:格式化字符串,其中可以包含占位符來(lái)指定如何格式化參數(shù)。
返回值:
- 返回一個(gè)字符串,表示格式化后的結(jié)果。
適用場(chǎng)景:
- 當(dāng)需要將多個(gè)值組合成一個(gè)字符串進(jìn)行后續(xù)處理時(shí),
Sprint
系列函數(shù)非常方便。
示例代碼:
package main import "fmt" func main() { // 示例1 str1 := fmt.Sprint("Hello, ", "World!") fmt.Println(str1) // 輸出:Hello, World! // 示例2 name := "Alice" age := 25 str2 := fmt.Sprintf("Name: %s, Age: %d", name, age) fmt.Println(str2) // 輸出:Name: Alice, Age: 25 // 示例3 name := "Alice" age := 25 str3 := fmt.Sprintln("Name: ", name, " Age: ", age) fmt.Print(str3) // 輸出:Name: Alice Age: 25\n // 示例4:格式化多個(gè)數(shù)據(jù)項(xiàng) data := []int{1, 2, 3, 4, 5} str4 := fmt.Sprint("Data: ", data) fmt.Println(str4) // 輸出:Data: [1 2 3 4 5] }
Errorf函數(shù)
Errorf
是Go語(yǔ)言中fmt
包的一個(gè)函數(shù),用于生成一個(gè)格式化的錯(cuò)誤消息并將其作為error
類(lèi)型返回。
func Errorf(format string, a ...any) error
參數(shù)說(shuō)明:
format
:格式化字符串,其中可以包含占位符來(lái)指定如何格式化參數(shù)。a
:要格式化的值列表,這些值將根據(jù)格式化字符串中的占位符進(jìn)行格式化。
返回值:
- 返回一個(gè)
error
類(lèi)型的值,表示格式化后的錯(cuò)誤消息。
適用場(chǎng)景:
- 在需要返回錯(cuò)誤信息的場(chǎng)景中,
Errorf
函數(shù)可以幫助我們快速生成格式化的錯(cuò)誤消息。
示例代碼:
package main import "fmt" func main() { // 示例1:簡(jiǎn)單的錯(cuò)誤消息 err1 := fmt.Errorf("an error occurred") fmt.Println(err1) // 輸出:an error occurred // 示例2:包含變量的錯(cuò)誤消息 filename := "data.txt" err2 := fmt.Errorf("failed to open file: %s", filename) fmt.Println(err2) // 輸出:failed to open file: data.txt // 示例3:包含多個(gè)變量的錯(cuò)誤消息 age := 25 err3 := fmt.Errorf("invalid age %d for user %s", age, "Alice") fmt.Println(err3) // 輸出:invalid age 25 for user Alice // 示例4:嵌套錯(cuò)誤 err4 := fmt.Errorf("wrapper error: %w", err2) fmt.Println(err4) // 輸出:wrapper error: failed to open file: data.txt }
二、獲取輸入
fmt.Scan系列函數(shù)
fmt.Scan
、fmt.Scanf
和fmt.Scanln
函數(shù)用于從標(biāo)準(zhǔn)輸入(通常是鍵盤(pán))讀取數(shù)據(jù),并根據(jù)格式字符串將輸入值轉(zhuǎn)換為變量。
fmt.Scan
:從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),根據(jù)變量的類(lèi)型自動(dòng)匹配輸入的格式。fmt.Scanf
:從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),并根據(jù)格式字符串將輸入值轉(zhuǎn)換為變量,允許更精確的格式控制。fmt.Scanln
:從標(biāo)準(zhǔn)輸入讀取一行數(shù)據(jù),并根據(jù)格式字符串將輸入值轉(zhuǎn)換為變量,在讀取輸入后會(huì)消費(fèi)掉換行符。
函數(shù)簽名如下:
func Scan(a ...any) (n int, err error) func Scanf(format string, a ...any) (n int, err error) func Scanln(a ...any) (n int, err error)
參數(shù)說(shuō)明:
format
:格式化字符串,其中可以包含占位符來(lái)指定如何解析輸入值。a
:一個(gè)或多個(gè)指針類(lèi)型的參數(shù),表示要存儲(chǔ)輸入值的變量。
返回值:
n
:成功讀取的值的數(shù)量。err
:如果發(fā)生錯(cuò)誤,則返回錯(cuò)誤信息,否則為nil
。
適用場(chǎng)景:
- 當(dāng)需要從控制臺(tái)讀取用戶輸入時(shí),
fmt.Scan
系列函數(shù)非常有用。
示例代碼:
package main import "fmt" func main() { // fmt.Scan示例 var num int fmt.Print("Enter an integer: ") _, err := fmt.Scan(&num) if err != nil { fmt.Println("Error:", err) return } fmt.Println("You entered:", num) // fmt.Scanf示例 var name string var age int var height float64 fmt.Print("Enter name, age, and height: ") _, err = fmt.Scanf("%s %d %f", &name, &age, &height) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height) // fmt.Scanln示例 var sentence string fmt.Print("Enter a sentence: ") _, err = fmt.Scanln(&sentence) if err != nil { fmt.Println("Error:", err) return } fmt.Println("You entered:", sentence) }
Fscan系列函數(shù)
Fscan
、Fscanln
和Fscanf
函數(shù)用于從一個(gè)io.Reader
中讀取數(shù)據(jù),并根據(jù)格式字符串將輸入值轉(zhuǎn)換為變量。
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)
參數(shù)說(shuō)明:
r
:一個(gè)實(shí)現(xiàn)了io.Reader
接口的對(duì)象,表示要讀取數(shù)據(jù)的輸入流。a
:一個(gè)或多個(gè)指針類(lèi)型的參數(shù),表示要存儲(chǔ)輸入值的變量。format
:格式化字符串,其中可以包含占位符來(lái)指定如何解析輸入值。
返回值:
n
:成功讀取的值的數(shù)量。err
:如果發(fā)生錯(cuò)誤,則返回錯(cuò)誤信息,否則為nil
。
適用場(chǎng)景:
- 當(dāng)需要從文件、網(wǎng)絡(luò)流等
io.Reader
中讀取數(shù)據(jù)時(shí),Fscan
系列函數(shù)非常有用。
示例代碼:
package main import ( "bufio" "fmt" "os" "strings" ) func main() { // 示例1:從標(biāo)準(zhǔn)輸入讀取 reader := bufio.NewReader(os.Stdin) var num1, num2 int fmt.Print("Enter two integers: ") _, err := fmt.Fscan(reader, &num1, &num2) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("You entered: %d and %d\n", num1, num2) // 示例2:從字符串讀取 data := "Alice 25 1.75\nBob 30 1.80" strReader := strings.NewReader(data) var name string var age int var height float64 // 讀取第一行 _, err = fmt.Fscan(strReader, &name, &age, &height) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height) // 讀取第二行 _, err = fmt.Fscan(strReader, &name, &age, &height) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height) // 示例3:從文件讀取 file, err := os.Open("input.txt") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() var filename string var size int var isReadable bool _, err = fmt.Fscan(file, &filename, &size, &isReadable) if err != nil { fmt.Println("Error reading file:", err) return } fmt.Printf("Filename: %s, Size: %d, IsReadable: %t\n", filename, size, isReadable) }
Sscan系列函數(shù)
Sscan
、Sscanln
和Sscanf
函數(shù)用于從一個(gè)字符串中讀取數(shù)據(jù),并根據(jù)格式字符串將輸入值轉(zhuǎn)換為變量。
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)
參數(shù)說(shuō)明:
str
:要解析的字符串。a
:一個(gè)或多個(gè)指針類(lèi)型的參數(shù),表示要存儲(chǔ)輸入值的變量。format
:格式化字符串,其中可以包含占位符來(lái)指定如何解析輸入值。
返回值:
n
:成功讀取的值的數(shù)量。err
:如果發(fā)生錯(cuò)誤,則返回錯(cuò)誤信息,否則為nil
。
適用場(chǎng)景:
- 當(dāng)需要從字符串中提取數(shù)據(jù)時(shí),
Sscan
系列函數(shù)非常方便。
示例代碼:
package main import "fmt" func main() { // 示例1:從字符串讀取一個(gè)整數(shù) str1 := "42" var num int _, err := fmt.Sscan(str1, &num) if err != nil { fmt.Println("Error:", err) return } fmt.Println("You entered:", num) // 示例2:從字符串讀取多個(gè)值 str2 := "Alice 25 1.75" var name string var age int var height float64 _, err = fmt.Sscan(str2, &name, &age, &height) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Name: %s, Age: %d, Height: %.2f\n", name, age, height) // 示例3:從字符串讀取布爾值 str3 := "true" var isStudent bool _, err = fmt.Sscan(str3, &isStudent) if err != nil { fmt.Println("Error:", err) return } fmt.Println("Is Student:", isStudent) // 示例4:從字符串讀取帶有空格的字符串 str4 := `"Hello World"` var sentence string _, err = fmt.Sscan(str4, &sentence) if err != nil { fmt.Println("Error:", err) return } fmt.Println("You entered:", sentence) }
三、總結(jié)
Go語(yǔ)言的fmt
包提供了豐富多樣的輸入輸出功能,無(wú)論是格式化輸出、文件寫(xiě)入,還是從各種輸入源讀取數(shù)據(jù),都能輕松應(yīng)對(duì)。熟練掌握fmt
包的使用,能夠讓你在Go語(yǔ)言的開(kāi)發(fā)中更加得心應(yīng)手,提高開(kāi)發(fā)效率和代碼的可讀性。希望本文對(duì)你理解和使用fmt
包有所幫助!
到此這篇關(guān)于Go語(yǔ)言fmt包的具體使用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言fmt包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go判斷文件夾是否存在并創(chuàng)建的實(shí)例
這篇文章主要介紹了go判斷文件夾是否存在,并創(chuàng)建的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12詳解go-micro微服務(wù)consul配置及注冊(cè)中心
這篇文章主要為大家介紹了go-micro微服務(wù)consul配置及注冊(cè)中心示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Golang如何用gorm實(shí)現(xiàn)分頁(yè)的功能
這篇文章主要介紹了Golang如何用gorm實(shí)現(xiàn)分頁(yè)的功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06go語(yǔ)言 swagger 查詢(xún) json 字段注釋的示例代碼
在Go語(yǔ)言中,使用Swagger通過(guò)swag工具和gin-gonic框架生成API文檔,涉及引入依賴(lài)、定義模型、添加注釋等步驟,示例中展示了如何為接受查詢(xún)參數(shù)的API端點(diǎn)添加注釋,感興趣的朋友跟隨小編一起看看吧2024-09-09一文帶你玩轉(zhuǎn)Golang Prometheus Eexporter開(kāi)發(fā)
本文分兩大塊,一是搞清楚prometheus四種類(lèi)型的指標(biāo)Counter,Gauge,Histogram,Summary用golang語(yǔ)言如何構(gòu)造這4種類(lèi)型對(duì)應(yīng)的指標(biāo),二是搞清楚修改指標(biāo)值的場(chǎng)景和方式,感興趣的可以了解一下2023-02-02Go?gRPC進(jìn)階教程服務(wù)超時(shí)設(shè)置
這篇文章主要為大家介紹了Go?gRPC進(jìn)階,gRPC請(qǐng)求的超時(shí)時(shí)間設(shè)置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06