GoLang語法之標(biāo)準(zhǔn)庫fmt.Printf的使用
fmt
fmt包實現(xiàn)了類似C語言printf和scanf的格式化I/O。主要分為向外輸出內(nèi)容和獲取輸入內(nèi)容兩大部分。
fmt的向外輸出
標(biāo)準(zhǔn)庫fmt提供了以下幾種輸出相關(guān)函數(shù)。print,F(xiàn)print,Sprint,Errorf,
Print系列函數(shù)會將內(nèi)容輸出到系統(tǒng)的標(biāo)準(zhǔn)輸出,區(qū)別在于Print函數(shù)直接輸出內(nèi)容,Printf函數(shù)支持格式化輸出字符串,Println函數(shù)會在輸出內(nèi)容的結(jié)尾添加一個換行符。
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)
說到這里就不得說一個東西。格式化占位。
格式化占位
*printf
系列函數(shù)都支持format
格式化參數(shù),在這里我們按照占位符將被替換的變量類型劃分,方便查詢和記憶。
通用占位符
占位符 | 說明 |
---|---|
%v | 值的默認(rèn)格式表示 |
%+v | 類似%v,但輸出結(jié)構(gòu)體時會添加字段名 |
%#v | 值的Go語法表示 |
%T | 打印值的類型 |
%% | 百分號 |
例子:
fmt.Printf("%v\n", 100) //100 fmt.Printf("%v\n", false) //false o := struct{ name string }{"你好"} fmt.Printf("%v\n", o) //{小王子} fmt.Printf("%#v\n", o) //struct { name string }{name:"小王子"} fmt.Printf("%T\n", o)//struct { name string } fmt.Printf("100%%\n")//100%
布爾類型占位
占位符 | 說明 |
---|---|
%t | true或false |
整型占位
占位符 | 說明 |
---|---|
%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) //1000001 fmt.Printf("%c\n", n) //A fmt.Printf("%d\n", n) //65 fmt.Printf("%o\n", n) //101 fmt.Printf("%x\n", n) //41 fmt.Printf("%X\n", n) //41
浮點數(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) //6946802425218990p-49 fmt.Printf("%e\n", f)//1.234000e+01 fmt.Printf("%E\n", f)//1.234000E+01 fmt.Printf("%f\n", f)//12.340000 fmt.Printf("%g\n", f)//12.34 fmt.Printf("%G\n", f)//12.34
字符串和[]byte
占位符 | 說明 |
---|---|
%s | 直接輸出字符串或者[]byte |
%q | 該值對應(yīng)的雙引號括起來的go語法字符串字面值,必要時會采用安全的轉(zhuǎn)義表示 |
%x | 每個字節(jié)用兩字符十六進(jìn)制數(shù)表示(使用a-f) |
%X | 每個字節(jié)用兩字符十六進(jìn)制數(shù)表示(使用A-F) |
s := "小王子" fmt.Printf("%s\n", s)//小王子 fmt.Printf("%q\n", s)//"小王子" fmt.Printf("%x\n", s)//e5b08fe78e8be5ad90 fmt.Printf("%X\n", s)//E5B08FE78E8BE5AD90
指針
占位符 | 說明 |
---|---|
%p | 表示為十六進(jìn)制,并加上前導(dǎo)的0x |
%#p | 表示為十六進(jìn)制,不加前導(dǎo)的0x |
a := 10 fmt.Printf("%p\n", &a) //0xc000094000 fmt.Printf("%#p\n", &a) //c000094000
寬度表示符
寬度通過一個緊跟在百分號后面的十進(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 := 12.34 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)
其他
占位符 | 說明 |
---|---|
‘+’ | 總是輸出數(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ù)號后面; |
Fprint
Fprint系列函數(shù)會將內(nèi)容輸出到一個io.Writer接口類型的變量w中,我們通常用這個函數(shù)往文件中寫入內(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)
注意,只要滿足io.Writer接口的類型都支持寫入。
// 向標(biāo)準(zhǔn)輸出寫入內(nèi)容 fmt.Fprintln(os.Stdout, "向標(biāo)準(zhǔn)輸出寫入內(nèi)容") fileObj, err := os.OpenFile("./xx.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { fmt.Println("打開文件出錯,err:", err) return } name := "沙河小王子" // 向打開的文件句柄中寫入內(nèi)容 fmt.Fprintf(fileObj, "往文件中寫如信息:%s", name)
Sprint
Sprint系列函數(shù)會把傳入的數(shù)據(jù)生成并返回一個字符串
func Sprint(a ...interface{}) string func Sprintf(format string, a ...interface{}) string func Sprintln(a ...interface{}) string
s1 := fmt.Sprint("沙河小王子") name := "沙河小王子" age := 18 s2 := fmt.Sprintf("name:%s,age:%d", name, age) s3 := fmt.Sprintln("沙河小王子") fmt.Println(s1, s2, s3)
Errorf
Errorf函數(shù)根據(jù)format參數(shù)生成格式化字符串并返回一個包含該字符串的錯誤。
func Errorf(format string, a ...interface{}) erro
通常使用這種方式來自定義錯誤類型err := fmt.Errorf("這是一個錯誤")
fmt.Errorf函數(shù)加了一個%w占位符fmt.Errorf函數(shù)新加了一個%w占位符Error的Wrapping Error
e := errors.New("原始錯誤e") w := fmt.Errorf("Wrap了一個錯誤%w", e)
fmt的獲取輸入
Go語言fmt包下有fmt.Scan、fmt.Scanf、fmt.Scanln三個函數(shù),可以在程序運行過程中從標(biāo)準(zhǔn)輸入獲取用戶的輸入。
Fscan系列
這幾個函數(shù)功能分別類似于fmt.Scan、fmt.Scanf、fmt.Scanln三個函數(shù),只不過它們不是從標(biāo)準(zhǔn)輸入中讀取數(shù)據(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)
Sscan系列
這幾個函數(shù)功能分別類似于fmt.Scan、fmt.Scanf、fmt.Scanln三個函數(shù),只不過它們不是從標(biāo)準(zhǔn)輸入中讀取數(shù)據(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)
fmt.Scan
fmt.Scan從標(biāo)準(zhǔn)輸入中掃描用戶輸入的數(shù)據(jù),將以空白符分隔的數(shù)據(jù)分別存入指定的參數(shù)。
- Scan從標(biāo)準(zhǔn)輸入
掃描文本
,讀取由空白符
分隔的值保存到傳遞給本函數(shù)的參數(shù)中,換行符視為空白符
。 - 本函數(shù)
返回
成功掃描的數(shù)據(jù)個數(shù)
和遇到的任何錯誤
。如果讀取的數(shù)據(jù)個數(shù)
比提供的參數(shù)少
,會返回一個錯誤
報告原因。
func Scan(a ...interface{}) (n int, err error)
func main() { var ( name string age int married bool ) fmt.Scan(&name, &age, &married) fmt.Printf("掃描結(jié)果 name:%s age:%d married:%t \n", name, age, married) }
小王子 28 false //輸入
掃描結(jié)果 name:小王子 age:28 married:false //輸入后的結(jié)果
fmt.Scanf
- Scanf從標(biāo)準(zhǔn)輸入掃描文本,根據(jù)format參數(shù)指定的格式去讀取由空白符分隔的值保存到傳遞給本函數(shù)的參數(shù)中。
- 本函數(shù)返回成功掃描的數(shù)據(jù)個數(shù)和遇到的任何錯誤。
func Scanf(format string, a ...interface{}) (n int, err error)
例子
func main() { var ( name string age int married bool ) fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married) fmt.Printf("掃描結(jié)果 name:%s age:%d married:%t \n", name, age, married) }
1:小王子 2:28 3:false //輸入
掃描結(jié)果 name:小王子 age:28 married:false //輸出
fmt.Scanf不同于fmt.Scan簡單的以空格作為輸入數(shù)據(jù)的分隔符,fmt.Scanf為輸入數(shù)據(jù)指定了具體的輸入內(nèi)容格式,只有按照格式輸入數(shù)據(jù)才會被掃描并存入對應(yīng)變量。
我們還是按照上個示例中以空格分隔的方式輸入,fmt.Scanf就不能正確掃描到輸入的數(shù)據(jù)。
小王子 28 false //輸入的值
掃描結(jié)果 name: age:0 married:false //輸出的值
fmt.Scanln
- Scanln類似Scan,它在遇到換行時才停止掃描。最后一個數(shù)據(jù)后面必須有換行或者到達(dá)結(jié)束位置。
- 本函數(shù)返回成功掃描的數(shù)據(jù)個數(shù)和遇到的任何錯誤。
func Scanln(a ...interface{}) (n int, err error)
fmt.Scanln遇到回車就結(jié)束掃描了,這個比較常用。
bufio.NewReader
有時候我們想完整獲取輸入的內(nèi)容,而輸入的內(nèi)容可能包含空格,這種情況下可以使用bufio包來實現(xiàn)。
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) }
到此這篇關(guān)于GoLang語法之標(biāo)準(zhǔn)庫fmt.Printf的使用的文章就介紹到這了,更多相關(guān)GoLang 標(biāo)準(zhǔn)庫fmt.Print內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實現(xiàn)的聊天程序服務(wù)端和客戶端代碼分享
這篇文章主要介紹了Golang實現(xiàn)的聊天程序服務(wù)端和客戶端代碼分享,本文先是講解了實現(xiàn)邏輯,然后給出了實現(xiàn)代碼,需要的朋友可以參考下2014-10-10超實用的Golang通道指南之輕松實現(xiàn)并發(fā)編程
Golang?中的通道是一種高效、安全、靈活的并發(fā)機(jī)制,用于在并發(fā)環(huán)境下實現(xiàn)數(shù)據(jù)的同步和傳遞。本文主要介紹了如何利用通道輕松實現(xiàn)并發(fā)編程,需要的可以參考一下2023-04-04