Go常用標(biāo)準(zhǔn)庫(kù)之fmt的簡(jiǎn)介與使用詳解
一、介紹
fmt 是 Go 語(yǔ)言中的一個(gè)常用標(biāo)準(zhǔn)庫(kù),它用于格式化輸入和輸出數(shù)據(jù)。fmt 包提供了一系列函數(shù),可以幫助你將數(shù)據(jù)以特定的格式打印到標(biāo)準(zhǔn)輸出(通常是終端)或?qū)?shù)據(jù)格式化為字符串以供后續(xù)處理。這個(gè)庫(kù)的名稱 "fmt" 來自于 "format",因?yàn)樗饕糜诟袷交瘮?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ù)實(shí)現(xiàn)的。這對(duì)于從用戶獲取輸入數(shù)據(jù)非常有用。 - 字符串格式化:你可以使用
Sprintf函數(shù)將數(shù)據(jù)格式化為字符串而不是直接輸出到標(biāo)準(zhǔn)輸出,這對(duì)于構(gòu)建日志消息或其他需要格式化的字符串很有用。 - 錯(cuò)誤格式化:fmt 包也提供了
Errorf函數(shù),用于將格式化的錯(cuò)誤消息作為 error 類型返回,方便錯(cuò)誤處理。 - 格式化占位符:在格式化字符串中,你可以使用占位符來指定如何格式化數(shù)據(jù)。常見的占位符包括
%d(整數(shù)),%f(浮點(diǎn)數(shù)),%s(字符串)等。
二、向外輸出
標(biāo)準(zhǔn)庫(kù) fmt 提供了多種用于輸出的函數(shù),每個(gè)函數(shù)都有不同的用途和輸出方式。以下是一些常用的輸出相關(guān)函數(shù):
2.1 Print 系列
Print:用于將文本輸出到標(biāo)準(zhǔn)輸出。它接受任意數(shù)量的參數(shù),并將它們串聯(lián)成一個(gè)字符串輸出,不會(huì)添加換行符。Printf:用于格式化輸出到標(biāo)準(zhǔn)輸出。它接受一個(gè)格式化字符串和一系列參數(shù),根據(jù)格式化字符串的占位符將參數(shù)格式化并輸出。Println:類似于Print,但會(huì)在輸出后自動(dòng)添加一個(gè)換行符。
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)
舉個(gè)簡(jiǎn)單的例子:
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ù)列表包括一個(gè) 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)
舉個(gè)例子:
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("打開文件出錯(cuò),err:", err)
return
}
name := "jarvis"
// 向打開的文件句柄中寫入內(nèi)容
fmt.Fprintf(fileObj, "往文件中寫如信息:%s", name)
}
這個(gè)示例創(chuàng)建了一個(gè)名為 "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
簡(jiǎn)單的示例代碼如下:
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)建格式化的錯(cuò)誤消息并返回一個(gè) error 類型的值。這允許你將格式化的錯(cuò)誤消息返回給調(diào)用者,以便更好地進(jìn)行錯(cuò)誤處理。這些函數(shù)的用法類似于 Sprintf,但它們返回一個(gè) error 值而不是字符串。
Errorf:根據(jù)format參數(shù)生成格式化字符串并返回一個(gè)包含該字符串的錯(cuò)誤。
func Errorf(format string, a ...interface{}) error
通常使用這種方式來自定義錯(cuò)誤類型,例如:
err := fmt.Errorf("這是一個(gè)錯(cuò)誤")
三、格式化占位符
*printf系列函數(shù)都支持format格式化參數(shù),在這里我們按照占位符將被替換的變量類型劃分,方便查詢和記憶。
3.1 通用占位符
通用占位符用于格式化不同類型的數(shù)據(jù):
| 占位符 | 說明 |
|---|---|
| %v | 值的默認(rèn)格式表示 |
| %+v | 類似%v,但輸出結(jié)構(gòu)體時(shí)會(huì)添加字段名 |
| %#v | 值的Go語(yǔ)法表示 |
| %T | 打印值的類型 |
| %% | 百分號(hào) |
代碼示例:
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 | 該值對(duì)應(yīng)的unicode碼值 |
| %d | 表示為十進(jìn)制 |
| %o | 表示為八進(jìn)制 |
| %x | 表示為十六進(jìn)制,使用a-f |
| %X | 表示為十六進(jìn)制,使用A-F |
| %U | 表示為Unicode格式:U+1234,等價(jià)于"U+%04X" |
| %q | 該值對(duì)應(yīng)的單引號(hào)括起來的go語(yǔ)法字符字面值,必要時(shí)會(huì)采用安全的轉(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 浮點(diǎn)數(shù)與復(fù)數(shù)
| 占位符 | 說明 |
|---|---|
| %b | 無小數(shù)部分、二進(jìn)制指數(shù)的科學(xué)計(jì)數(shù)法,如-123456p-78 |
| %e | 科學(xué)計(jì)數(shù)法,如-1234.456e+78 |
| %E | 科學(xué)計(jì)數(shù)法,如-1234.456E+78 |
| %f | 有小數(shù)部分但無指數(shù)部分,如123.456 |
| %F | 等價(jià)于%f |
| %g | 根據(jù)實(shí)際情況采用%e或%f格式(以獲得更簡(jiǎn)潔、準(zhǔn)確的輸出) |
| %G | 根據(jù)實(shí)際情況采用%E或%F格式(以獲得更簡(jiǎn)潔、準(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 | 該值對(duì)應(yīng)的雙引號(hào)括起來的go語(yǔ)法字符串字面值,必要時(shí)會(huì)采用安全的轉(zhuǎn)義表示 |
| %x | 每個(gè)字節(jié)用兩字符十六進(jìn)制數(shù)表示(使用a-f |
| %X | 每個(gè)字節(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)識(shí)符
寬度通過一個(gè)緊跟在百分號(hào)后面的十進(jìn)制數(shù)指定,如果未指定寬度,則表示值時(shí)除必需之外不作填充。精度通過(可選的)寬度后跟點(diǎn)號(hào)后跟的十進(jìn)制數(shù)指定。如果未指定精度,會(huì)使用默認(rèn)精度;如果點(diǎn)號(hào)后沒有跟數(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ù)號(hào);對(duì)%q(%+q)會(huì)生成全部是ASCII字符的輸出(通過轉(zhuǎn)義); |
| ’ ' | 對(duì)數(shù)值,正數(shù)前加空格而負(fù)數(shù)前加負(fù)號(hào);對(duì)字符串采用%x或%X時(shí)(% x或% X)會(huì)給各打印的字節(jié)之間加空格 |
| ‘-’ | 在輸出右邊填充空白而不是默認(rèn)的左邊(即從默認(rèn)的右對(duì)齊切換為左對(duì)齊); |
| ‘#’ | 八進(jìn)制數(shù)前加0(%#o),十六進(jìn)制數(shù)前加0x(%#x)或0X(%#X),指針去掉前面的0x(%#p)對(duì)%q(%#q),對(duì)%U(%#U)會(huì)輸出空格和單引號(hào)括起來的go字面值; |
| ‘0’ | 使用0而不是空格填充,對(duì)于數(shù)值類型會(huì)把填充的0放在正負(fù)號(hào)后面; |
舉個(gè)例子:
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 語(yǔ)言的 fmt 包提供了 fmt.Scan、fmt.Scanf 和 fmt.Scanln 這三個(gè)函數(shù),用于從標(biāo)準(zhǔn)輸入獲取用戶的輸入。這些函數(shù)允許你與用戶交互,從標(biāo)準(zhǔn)輸入流中讀取不同類型的數(shù)據(jù)并將其存儲(chǔ)在相應(yīng)的變量中。
4.1 fmt.Scan 函數(shù)
Scan 函數(shù)用于從標(biāo)準(zhǔn)輸入中獲取用戶的輸入,并將輸入的數(shù)據(jù)存儲(chǔ)在變量中。它根據(jù)空格分隔輸入,適合獲取多個(gè)輸入值。
函數(shù)定義如下:
func Scan(a ...interface{}) (n int, err error)
- Scan從標(biāo)準(zhǔn)輸入掃描文本,讀取由空白符分隔的值保存到傳遞給本函數(shù)的參數(shù)中,換行符視為空白符。
- 本函數(shù)返回成功掃描的數(shù)據(jù)個(gè)數(shù)和遇到的任何錯(cuò)誤。如果讀取的數(shù)據(jù)個(gè)數(shù)比提供的參數(shù)少,會(huì)返回一個(gè)錯(cuò)誤報(bào)告原因。
具體代碼示例如下:
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)
}
在這個(gè)示例中,fmt.Scanf 使用格式字符串 %s %d 來解析輸入的姓名和年齡。
4.2 fmt.Scanln 函數(shù)
Scanln 函數(shù)用于從標(biāo)準(zhǔn)輸入中獲取用戶的輸入,并將輸入的數(shù)據(jù)存儲(chǔ)在變量中,每行一個(gè)變量。它通常用于獲取多個(gè)輸入值,每個(gè)值在單獨(dú)的行中輸入。
函數(shù)定義如下:
func Scanln(a ...interface{}) (n int, err error)
- Scanln類似Scan,它在遇到換行時(shí)才停止掃描。最后一個(gè)數(shù)據(jù)后面必須有換行或者到達(dá)結(jié)束位置。
- 本函數(shù)返回成功掃描的數(shù)據(jù)個(gè)數(shù)和遇到的任何錯(cuò)誤。
代碼示例:
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 用于獲取用戶輸入的姓名和年齡,并將它們存儲(chǔ)在相應(yīng)的變量中。輸入的每一行都對(duì)應(yīng)一個(gè)變量。
4.3 fmt.Scanf 函數(shù)
Scanf 函數(shù)用于根據(jù)格式規(guī)范解析輸入,并將數(shù)據(jù)存儲(chǔ)在變量中。它允許你指定輸入的格式,并可以處理不同類型的數(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ù)個(gè)數(shù)和遇到的任何錯(cuò)誤。
代碼示例如下:
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)
}
在這個(gè)示例中,fmt.Scanf 使用格式字符串 %s %d 來解析輸入的姓名和年齡。
4.4 使用 bufio 包獲取輸入
bufio 包提供了一種更靈活的方式來處理輸入,特別是在需要完整讀取一行或多行輸入的情況下。你可以使用 bufio.NewReader 創(chuàng)建一個(gè)輸入緩沖區(qū),然后使用 ReadString 函數(shù)來讀取輸入,直到指定的分隔符(例如換行符 \n)。這允許你獲取包含空格在內(nèi)的完整輸入內(nèi)容。
func bufioDemo() {
reader := bufio.NewReader(os.Stdin) // 從標(biāo)準(zhǔn)輸入生成讀對(duì)象
fmt.Print("請(qǐng)輸入內(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 類似,但允許你從任何實(shí)現(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) // 從字符串生成讀對(duì)象
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)庫(kù)之fmt的簡(jiǎn)介與使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Go fmt的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang微服務(wù)框架Kratos實(shí)現(xiàn)分布式任務(wù)隊(duì)列Asynq的方法詳解
任務(wù)隊(duì)列(Task Queue) 一般用于跨線程或跨計(jì)算機(jī)分配工作的一種機(jī)制,在Golang語(yǔ)言里面,我們有像Asynq和Machinery這樣的類似于Celery的分布式任務(wù)隊(duì)列,本文就給大家詳細(xì)介紹一下Golang微服務(wù)框架Kratos實(shí)現(xiàn)分布式任務(wù)隊(duì)列Asynq的方法,需要的朋友可以參考下2023-09-09
go如何使用gin結(jié)合jwt做登錄功能簡(jiǎn)單示例
jwt全稱Json web token,是一種認(rèn)證和信息交流的工具,這篇文章主要給大家介紹了關(guān)于go如何使用gin結(jié)合jwt做登錄功能的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
一文帶你掌握Golang中panic與recover的使用方法
這篇文章主要介紹了Golang中panic與recover的作用和使用方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考一下2023-04-04
Golang中類型轉(zhuǎn)換利器cast庫(kù)的用法詳解
cast庫(kù)是一個(gè)簡(jiǎn)潔而強(qiáng)大的第三方庫(kù),它的主要功能是實(shí)現(xiàn)類型之間的安全轉(zhuǎn)換,而在Golang開發(fā)中,類型轉(zhuǎn)換是一個(gè)常見且不可避免的過程,下面我們就來看看cast庫(kù)在Golang中的具體應(yīng)用吧2024-11-11
Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解
這篇文章主要為大家介紹了Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版)
這篇文章主要介紹了go redis實(shí)現(xiàn)滑動(dòng)窗口限流的方式(redis版),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
通過與Java功能上的對(duì)比來學(xué)習(xí)Go語(yǔ)言
這篇文章主要介紹了通過與Java功能上的對(duì)比來學(xué)習(xí)Go語(yǔ)言的相關(guān)資料,需要的朋友可以參考下2023-02-02

