golang標準庫之 fmt

BigSun丶發表於2024-03-06

目錄
  • fmt
    • 1. 獲取輸入
      • (1)fmt.Scan(常用)
      • (2)fmt.Scanln(常用)
      • (3)fmt.Scanf
    • 2. print、println、printf 輸出
    • 3. Sprint(瞭解即可)
    • 4. Errorf(瞭解即可)
    • 5. 格式化佔位符
      • (1)通用佔位符
      • (2)布林型佔位符
      • (3)整型佔位符
      • (4)浮點數與複數佔位符
      • (5)字串和[]byte佔位符
      • (6)指標佔位符
      • (7)寬度識別符號
      • (8)其他

fmt

  • fmt包實現了類似C語言printf和scanf的格式化I/O。主要分為輸出和獲取輸入兩大部分

  • 和python的直接使用f-string不同的是,Go中的格式化輸入和格式化輸出,都需要先導fmt包後才能使用

1. 獲取輸入

  • 作用就是python中的input

  • Go語言fmt包下有fmt.Scanfmt.Scanffmt.Scanln三個函式,可以在程式執行過程中從標準輸入獲取使用者的輸入

(1)fmt.Scan(常用)

Scan的函式定義: func Scan(a ...interface{}) (n int, err error)

********Scan的返回值一般沒啥用,通常不接收。注意:引數為變數地址********
Scan函式返回成功掃描的資料個數和遇到的任何錯誤。如果讀取的資料個數比提供的引數少,會返回一個錯誤報告原因

********Scan 函式用 空格 和 回車 當作每個輸入引數之間的間隔符 ,當回車時,若輸入引數的個數不夠,仍可以繼續輸入********


package main

import "fmt"

func main() {
	var (
		name    string
		age     int
		married bool
	)
	
    fmt.Print("請輸入:")
	cnt, res := fmt.Scan(&name, &age, &married)  // 直接寫成 fmt.Scan(&name, &age, &married) 就行,一般不用接收返回值
	fmt.Println("cnt,res", cnt, res)
	fmt.Printf("掃描結果 name:%s age:%d married:%t \n", name, age, married)
}

(2)fmt.Scanln(常用)

同上面的fmt.Scan用法一致,只有一點不同,就是fmt.Scanln方法,在輸入引數時,只能以空格作為不同引數之間的間隔符,回車會直接結束輸入

Scanln的函式定義: func Scanln(a ...interface{}) (n int, err error)

(3)fmt.Scanf

  • 格式化輸入,必須與定義的輸入內容格式一致,才能被接收
  • 在輸入引數時,只能以空格作為不同引數之間的間隔符,回車會直接結束輸入
package main

import "fmt"

func main() {
	var (
		name    string
		age     int
		married bool
	)
    
    fmt.Print("請輸入:")
	fmt.Scanf("1:%s 2:%d 3:%t", &name, &age, &married)
	fmt.Printf("掃描結果 name:%s age:%d married:%t \n", name, age, married)
}

/*

示例輸入:  1:小王子 2:28 3:false

必須按照:1:引數1 2:引數2 3:引數3   來進行輸入,且引數型別不能錯誤,可以漏輸右邊的部分,不能漏輸左邊的部分

1:引數1   // 引數1可以被接收到
1:引數1 2:引數2  // 引數1 引數2可以被接收到
2:引數2  // 引數2 不能被接收
*/

2. print、println、printf 輸出

  • fmt.print、fmt.println、fmt.printf 三種
    • print就是普通的輸出
    • println 會在輸出內容的結尾新增一個換行符,即可以自動換行
    • printf 為格式化輸出字串,能識別各種佔位符
函式定義:
func Print(a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)


簡單示例:

package main

import "fmt"

func main() {
	fmt.Print("在終端列印該資訊。")
	name := "沙河小王子"
	fmt.Printf("我是:%s\n", name)
	fmt.Println("在終端列印單獨一行顯示")
}

/*
在終端列印該資訊。我是:沙河小王子
在終端列印單獨一行顯示
*/

3. Sprint(瞭解即可)

  • Sprint系列函式會把傳入的資料生成並返回一個字串
函式定義:
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string


簡單示例:
package main

import "fmt"

func main() {
    s1 := fmt.Sprint("沙河小王子")
    name := "沙河小王子"
    age := 18
    s2 := fmt.Sprintf("name:%s,age:%d", name, age)
    s3 := fmt.Sprintln("沙河小王子")  // s3末尾因為Sprintln函式而多了一個換行符
    fmt.Println("1111")
    fmt.Print(s1, s2, s3)  // 這裡我們沒有換行,而下面的列印結果顯示,換行列印了2222
    fmt.Println("2222")
}

/*
1111
沙河小王子name:沙河小王子,age:18沙河小王子
2222
*/

4. Errorf(瞭解即可)

  • Errorf函式根據format引數生成格式化字串並返回一個包含該字串的錯誤
函式定義: func Errorf(format string, a ...interface{}) error

通常使用這種方式來自定義錯誤型別,例如:

err := fmt.Errorf("這是一個錯誤")

5. 格式化佔位符

  • 掌握常用的幾個即可 %% %d %s %p %T %.nf (n為保留的小數個數),其他當作瞭解

(1)通用佔位符

佔位符 說明
%v 值的預設格式表示,將值格式化為一個更緊湊的表示形式
%+v 類似%v,但輸出結構體時會新增欄位名
%#v 值的Go語法表示
%T 列印值的型別
%% 百分號

(2)布林型佔位符

佔位符 說明
%t true或false

(3)整型佔位符

佔位符 說明
%b 表示為二進位制
%c 該值對應的unicode碼值
%d 表示為十進位制
%o 表示為八進位制
%x 表示為十六進位制,使用a-f
%X 表示為十六進位制,使用A-F
%U 表示為Unicode格式:U+1234,等價於”U+%04X”
%q 該值對應的單引號括起來的go語法字元字面值,必要時會採用安全的轉義表示
  • 示例
package main

import "fmt"

func main() {
	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)
}

/*
1000001
A  
65 
101
41 
41 
*/

(4)浮點數與複數佔位符

佔位符 說明
%b 無小數部分、二進位制指數的科學計數法,如-123456p-78
%e 科學計數法,如-1234.456e+78
%E 科學計數法,如-1234.456E+78
%f 有小數部分但無指數部分,如123.456
%F 等價於%f
%g 根據實際情況採用%e或%f格式(以獲得更簡潔、準確的輸出)
%G 根據實際情況採用%E或%F格式(以獲得更簡潔、準確的輸出)
  • 示例
package main

import "fmt"

func main() {
	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)
}

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

(5)字串和[]byte佔位符

佔位符 說明
%s 直接輸出字串或者[]byte
%q 該值對應的雙引號括起來的go語法字串字面值,必要時會採用安全的轉義表示
%x 每個位元組用兩字元十六進位制數表示(使用a-f)
%X 每個位元組用兩字元十六進位制數表示(使用A-F)
  • 示例
package main

import "fmt"

func main() {
	s := "王子"
	fmt.Printf("%s\n", s)
	fmt.Printf("%q\n", s)
	fmt.Printf("%x\n", s)
	fmt.Printf("%X\n", s)
}

/*
王子
"王子"      
e78e8be5ad90
E78E8BE5AD90
*/

(6)指標佔位符

佔位符 說明
%p 表示為十六進位制,並加上前導的0x
%#p 表示為十六進位制,不加上前導的0x
  • 示例
package main

import "fmt"

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

// 0xc00000a0d8
// c00000a0d8

(7)寬度識別符號

  • 寬度透過一個緊跟在百分號後面的十進位制數指定,如果未指定寬度,則表示值時除必需之外不作填充。精度透過(可選的)寬度後跟點號後跟的十進位制數指定。如果未指定精度,會使用預設精度;如果點號後沒有跟數字,表示精度為0。舉例如下
  • 寬度可以理解為整型部分的長度,精度可以理解為小數的長度
佔位符 說明
%f 預設寬度,預設精度
%9f 寬度9,預設精度
%.2f 預設寬度,精度2
%9.2f 寬度9,精度2
%9.f 寬度9,精度0
  • 示例
package main

import "fmt"

func main() {
	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)
}

/*
12.340000
12.340000
12.34    
    12.34
       12
*/

(8)其他

佔位符 說明
’+’ 總是輸出數值的正負號;對%q(%+q)會生成全部是ASCII字元的輸出(透過轉義)
’ ‘ 對數值,正數前加空格而負數前加負號;對字串採用%x或%X時(% x或% X)會給各列印的位元組之間加空格
’-’ 在輸出右邊填充空白而不是預設的左邊(即從預設的右對齊切換為左對齊)
’#’ 八進位制數前加0(%#o),十六進位制數前加0x(%#x)或0X(%#X),指標去掉前面的0x(%#p)對%q(%#q),對%U(%#U)會輸出空格和單引號括起來的go字面值
‘0’ 使用0而不是空格填充,對於數值型別會把填充的0放在正負號後面
  • 示例
package main

import "fmt"

func main() {
	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)
}

/*
王子
   王子
王子   
   王子
王子   
   王子
000王子
*/

相關文章