Go語(yǔ)言fmt.Printf使用指南

轉(zhuǎn)載: https://www.cnblogs.com/xiao-xue-di/p/11521823.html

Go語(yǔ)言fmt.Printf使用指南

fmt標(biāo)準(zhǔn)庫(kù)是我們?cè)趯W(xué)習(xí)Go語(yǔ)言過程中接觸最早最頻繁的一個(gè)了,本文介紹了fmtb包的一些常用函數(shù)。

fmt

fmt包實(shí)現(xiàn)了類似C語(yǔ)言printf和scanf的格式化I/O。主要分為向外輸出內(nèi)容和獲取輸入內(nèi)容兩大部分。

向外輸出

標(biāo)準(zhǔn)庫(kù)fmt提供了以下幾種輸出相關(guān)函數(shù)。

Print

Print系列函數(shù)會(huì)將內(nèi)容輸出到系統(tǒng)的標(biāo)準(zhǔn)輸出,區(qū)別在于Print函數(shù)直接輸出內(nèi)容,Printf函數(shù)支持格式化輸出字符串,Println函數(shù)會(huì)在輸出內(nèi)容的結(jié)尾添加一個(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("在終端打印該信息。")
    name := "沙河小王子"
    fmt.Printf("我是:%s\n", name)
    fmt.Println("在終端打印單獨(dú)一行顯示")
}

執(zhí)行上面的代碼輸出:

在終端打印該信息。我是:沙河小王子
在終端打印單獨(dú)一行顯示

Fprint

Fprint系列函數(shù)會(huì)將內(nèi)容輸出到一個(gè)io.Writer接口類型的變量w中,我們通常用這個(gè)函數(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)

舉個(gè)例子:

// 向標(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("打開文件出錯(cuò),err:", err)
    return
}
name := "沙河小王子"
// 向打開的文件句柄中寫入內(nèi)容
fmt.Fprintf(fileObj, "往文件中寫如信息:%s", name)

注意,只要滿足io.Writer接口的類型都支持寫入。

Sprint

Sprint系列函數(shù)會(huì)把傳入的數(shù)據(jù)生成并返回一個(gè)字符串。

func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string

簡(jiǎn)單的示例代碼如下:

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ù)生成格式化字符串并返回一個(gè)包含該字符串的錯(cuò)誤。

func Errorf(format string, a ...interface{}) error

通常使用這種方式來自定義錯(cuò)誤類型,例如:

err := fmt.Errorf("這是一個(gè)錯(cuò)誤")

格式化占位符

*printf系列函數(shù)都支持format格式化參數(shù),在這里我們按照占位符將被替換的變量類型劃分,方便查詢和記憶。

通用占位符

占位符 說明
%v 值的默認(rèn)格式表示
%+v 類似%v,但輸出結(jié)構(gòu)體時(shí)會(huì)添加字段名
%#v 值的Go語(yǔ)法表示
%T 打印值的類型
%% 百分號(hào)

示例代碼如下:

fmt.Printf("%v\n", 100)
fmt.Printf("%v\n", false)
o := struct{ name string }{"小王子"}
fmt.Printf("%v\n", o)
fmt.Printf("%#v\n", o)
fmt.Printf("%T\n", o)
fmt.Printf("100%%\n")

輸出結(jié)果如下:

100
false
{小王子}
struct { name string }{name:"小王子"}
struct { name string }
100%

布爾型

占位符 說明
%t true或false

整型

占位符 說明
%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)

輸出結(jié)果如下:

1000001
A
65
101
41
41

浮點(diǎn)數(shù)與復(fù)數(shù)

占位符 說明
%b 無(wú)小數(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ù)部分但無(wú)指數(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)

輸出結(jié)果如下:

6946802425218990p-49
1.234000e+01
1.234000E+01
12.340000
12.34
12.34

字符串和[]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 := "小王子"
fmt.Printf("%s\n", s)
fmt.Printf("%q\n", s)
fmt.Printf("%x\n", s)
fmt.Printf("%X\n", s)

輸出結(jié)果如下:

小王子
"小王子"
e5b08fe78e8be5ad90
E5B08FE78E8BE5AD90

指針

占位符 說明
%p 表示為十六進(jìn)制,并加上前導(dǎo)的0x

示例代碼如下:

a := 10
fmt.Printf("%p\n", &a)
fmt.Printf("%#p\n", &a)

輸出結(jié)果如下:

0xc000094000
c000094000

寬度標(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 := 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)

輸出結(jié)果如下:

12.340000
12.340000
12.34
    12.34
       12

其他falg

占位符 說明
’+’ 總是輸出數(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 := "小王子"
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)

輸出結(jié)果如下:

小王子
  小王子
小王子  
  小王子
小王子  
   小王
00小王子

獲取輸入

Go語(yǔ)言fmt包下有fmt.Scan、fmt.Scanffmt.Scanln三個(gè)函數(shù),可以在程序運(yùn)行過程中從標(biāo)準(zhǔn)輸入獲取用戶的輸入。

fmt.Scan

函數(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)告原因。

具體代碼示例如下:

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)
}

將上面的代碼編譯后在終端執(zhí)行,在終端依次輸入小王子、28false使用空格分隔。

$ ./scan_demo 
小王子 28 false
掃描結(jié)果 name:小王子 age:28 married:false 

fmt.Scan從標(biāo)準(zhǔn)輸入中掃描用戶輸入的數(shù)據(jù),將以空白符分隔的數(shù)據(jù)分別存入指定的參數(shù)。

fmt.Scanf

函數(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ò)誤。

代碼示例如下:

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)
}

將上面的代碼編譯后在終端執(zhí)行,在終端按照指定的格式依次輸入小王子、28false。

$ ./scan_demo 
1:小王子 2:28 3:false
掃描結(jié)果 name:小王子 age:28 married:false 

fmt.Scanf不同于fmt.Scan簡(jiǎn)單的以空格作為輸入數(shù)據(jù)的分隔符,fmt.Scanf為輸入數(shù)據(jù)指定了具體的輸入內(nèi)容格式,只有按照格式輸入數(shù)據(jù)才會(huì)被掃描并存入對(duì)應(yīng)變量。

例如,我們還是按照上個(gè)示例中以空格分隔的方式輸入,fmt.Scanf就不能正確掃描到輸入的數(shù)據(jù)。

$ ./scan_demo 
小王子 28 false
掃描結(jié)果 name: age:0 married:false 

fmt.Scanln

函數(shù)簽名如下:

func Scanln(a ...interface{}) (n int, err error)

  • Scanln類似Scan,它在遇到換行時(shí)才停止掃描。最后一個(gè)數(shù)據(jù)后面必須有換行或者到達(dá)結(jié)束位置。
  • 本函數(shù)返回成功掃描的數(shù)據(jù)個(gè)數(shù)和遇到的任何錯(cuò)誤。

具體代碼示例如下:

func main() {
    var (
        name    string
        age     int
        married bool
    )
    fmt.Scanln(&name, &age, &married)
    fmt.Printf("掃描結(jié)果 name:%s age:%d married:%t \n", name, age, married)
}

將上面的代碼編譯后在終端執(zhí)行,在終端依次輸入小王子、28false使用空格分隔。

$ ./scan_demo 
小王子 28 false
掃描結(jié)果 name:小王子 age:28 married:false 

fmt.Scanln遇到回車就結(jié)束掃描了,這個(gè)比較常用。

bufio.NewReader

有時(shí)候我們想完整獲取輸入的內(nèi)容,而輸入的內(nèi)容可能包含空格,這種情況下可以使用bufio包來實(shí)現(xiàn)。示例代碼如下:

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)
}

Fscan系列

這幾個(gè)函數(shù)功能分別類似于fmt.Scanfmt.Scanf、fmt.Scanln三個(gè)函數(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系列

這幾個(gè)函數(shù)功能分別類似于fmt.Scan、fmt.Scanffmt.Scanln三個(gè)函數(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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 通用占位符 占位符說明%v以默認(rèn)的方式打印變量的值%T打印變量的類型%%字面上的百分號(hào),并非值的占位符 Inter...
    至尊貝閱讀 458評(píng)論 0 0
  • fmt標(biāo)準(zhǔn)庫(kù)是我們?cè)趯W(xué)習(xí)Go語(yǔ)言過程中接觸最早最頻繁的一個(gè)了,本文介紹了fmtb包的一些常用函數(shù)。 fmtfmt包...
    雪上霜閱讀 303評(píng)論 0 0
  • 1、首先需要了解哪些占位符分別代表什么 這些是死知識(shí),把常用的記住,不常用的直接查表就行了 golang 的fmt...
    Juha閱讀 77,016評(píng)論 0 21
  • 最后一次更新日期: 2019/4/13 NumPy 是一個(gè) Python 包。 它代表 “Numeric Pyth...
    jiedawang閱讀 1,654評(píng)論 0 4
  • golang 的fmt 包實(shí)現(xiàn)了格式化I/O函數(shù),類似于C的 printf 和 scanf。 定義示例類型和變量 ...
    李小斌_2018閱讀 304評(píng)論 0 0

友情鏈接更多精彩內(nèi)容