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
庫
1. 獲取輸入
(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)布林型佔位符
(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王子
*/