[TOC]
fmt 用類似于C的printf和scanf的函數實現格式化的I/O。
## 輸出函數
`Print` 系列的輸出函數
```go
func Print(a ...any) (n int, err error) // 打印內容
func Printf(format string, a ...any) (n int, err error) // 格式化打印內容
func Println(a ...any) (n int, err error) // 打印內容,默認帶換行符。
```
`Sprint` 系列的輸出函數
```go
func Sprint(a ...any) string // 返回字符串的內容
func Sprintf(format string, a ...any) string // 返回字符串的格式化內容
func Sprintln(a ...any) string // 返回字符串的內容,默認帶換行符
```
`Fprint` 系列的輸出函數
```go
func Fprint(w io.Writer, a ...any) (n int, err error) // 將內容a,寫入w。返回寫入字節數以及err信息
func Fprintf(w io.Writer, format string, a ...any) (n int, err error) // 將格式化內容a,寫入w。返回寫入字節數以及err信息
func Fprintln(w io.Writer, a ...any) (n int, err error) // 將內容a(默認帶換行符),寫入w。返回寫入字節數以及err信息
```
輸出函數示例
```go
package main
import (
"fmt"
"os"
)
func main() {
// Print 系列的輸出函數
name := "jiaxzeng"
fmt.Print("hello ", name, "\n")
fmt.Printf("hello %s\n", name)
fmt.Println("hello", name)
// Sprint 系列的輸出函數
fmt.Print("\n-------------------------------------\n")
s := fmt.Sprint("hello ", name)
fmt.Printf("s: %v\n", s)
s = fmt.Sprintf("hello %s", name)
fmt.Printf("s: %v\n", s)
s = fmt.Sprintln("hello", name)
fmt.Printf("s: %v\n", s)
// Fprint 系列的輸出函數
fmt.Print("\n-------------------------------------\n")
n, err := fmt.Fprint(os.Stdin, "hello ", name, ", ")
if err != nil {
fmt.Printf("Fprint failed, err: %v", err)
} else {
fmt.Printf("Byte size: %v\n", n)
}
n, err = fmt.Fprintf(os.Stdout, "hello %v, ", name)
if err != nil {
fmt.Printf("Fprint failed, err: %v", err)
} else {
fmt.Printf("Byte size: %v\n", n)
}
n, err = fmt.Fprintln(os.Stdout, "hello", name)
if err != nil {
fmt.Printf("Fprint failed, err: %v", err)
} else {
fmt.Printf("Byte size: %v\n", n)
}
}
// 運行結果
// hello jiaxzeng
// hello jiaxzeng
// hello jiaxzeng
// -------------------------------------
// s: hello jiaxzeng
// s: hello jiaxzeng
// s: hello jiaxzeng
// -------------------------------------
// hello jiaxzeng, Byte size: 16
// hello jiaxzeng, Byte size: 16
// hello jiaxzeng
// Byte size: 15
```
## 輸入函數
`Scan` 系列的輸入函數
> 從 os.Stdin 賦值給 變量a
```go
func Scan(a ...any) (n int, err error) // 變量a 是多個時,分割符可以是換行或空格
func Scanf(format string, a ...any) (n int, err error) // 格式化字符串時,連接符需要與字符串隔開;變量a 是多個時,只能一行輸入且需要輸入指定的分隔符。
func Scanln(a ...any) (n int, err error) // 變量a 是多個時,分隔符只能是空格。
```
`Sscan` 系列的輸入函數
> 從 字符串str 賦值給 變量a
```go
// 變量str 包含\n \t 空格,當做分割符識別對應的參數個數
func Sscan(str string, a ...any) (n int, err error)
// 變量str 包含\n \t 空格時,格式化字符串也需要對應個數的\n \t 空格。
func Sscanf(str string, format string, a ...any) (n int, err error)
// 與Sscan類似,但是變量str不能包含 \n
func Sscanln(str string, a ...any) (n int, err error)
```
`Fscan` 系列的輸入函數
> 從 `io.Reader` 賦值給 變量a ,`io.Reader` 可以通過 `strings.NewReader` 函數返回得到。
```go
// 變量r 包含\n \t 空格,當做分割符識別對應的參數個數
func Fscan(r io.Reader, a ...any) (n int, err error)
// 變量r 包含\n \t 空格時,格式化字符串也需要對應個數的\n \t 空格。
func Fscanf(r io.Reader, format string, a ...any) (n int, err error)
// 與Fscan類似,但是變量r不能包含 \n
func Fscanln(r io.Reader, a ...any) (n int, err error)
```
輸入函數示例
```go
package main
import (
"fmt"
"os"
"strings"
)
func main() {
// Scan 系列的輸入函數
fmt.Print("\n-------------------------------------\n")
var (
i int
str string
)
fmt.Print("請輸入數據: ")
// fmt.Scan(&str, &i)
// fmt.Scanf("%s + %d", &str, &i)
fmt.Scanln(&str, &i)
fmt.Printf("type is: %T, value is: %v\n", str, str)
fmt.Printf("type is: %T, value is: %v\n", i, i)
// Sscan 系列的輸入函數
fmt.Print("\n-------------------------------------\n")
fmt.Sscan("jiaxzeng \n 323", &str, &i)
fmt.Sscanf("jiaxzeng age is 18.", "%s age is %d.", &str, &i)
fmt.Sscanln("jiaxzeng \n 456", &str, &i)
fmt.Println(str, i)
// Fscan 系列的輸入函數
fmt.Print("\n-------------------------------------\n")
reader := strings.NewReader("xiaodunan \n 18")
fmt.Fscan(reader, &str, &i)
fmt.Printf("%s age is %d\n", str, i)
reader = strings.NewReader("xiaodunan is 18")
fmt.Fscanf(reader, "%s is %d", &str, &i)
fmt.Printf("%s age is %d\n", str, i)
reader = strings.NewReader("xiaodunan \n 18")
fmt.Fscanln(reader, &str, &i)
fmt.Printf("%s age is %d\n", str, i)
}
// 運行結果
// -------------------------------------
// 請輸入數據: test
// type is: string, value is: test
// type is: int, value is: 0
// -------------------------------------
// jiaxzeng 18
// -------------------------------------
// xiaodunan age is 18
// xiaodunan age is 18
// xiaodunan age is 18
```
- Golang簡介
- 開發環境
- Golang安裝
- 編輯器及快捷鍵
- vscode插件
- 第一個程序
- 基礎數據類型
- 變量及匿名變量
- 常量與iota
- 整型與浮點型
- 復數與布爾值
- 字符串
- 運算符
- 算術運算符
- 關系運算符
- 邏輯運算符
- 位運算符
- 賦值運算符
- 流程控制語句
- 獲取用戶輸入
- if分支語句
- for循環語句
- switch語句
- break_continue_goto語法
- 高階數據類型
- pointer指針
- array數組
- slice切片
- slice切片擴展
- map映射
- 函數
- 函數定義和調用
- 函數參數
- 函數返回值
- 作用域
- 函數形參傳遞
- 匿名函數
- 高階函數
- 閉包
- defer語句
- 內置函數
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 編碼
- 字符與字節
- 字符串
- 讀寫文件
- 結構體
- 類型別名和自定義類型
- 結構體聲明
- 結構體實例化
- 模擬構造函數
- 方法接收器
- 匿名字段
- 嵌套與繼承
- 序列化
- 接口
- 接口類型
- 值接收者和指針接收者
- 類型與接口對應關系
- 空接口
- 接口值
- 類型斷言
- 并發編程
- 基本概念
- goroutine
- channel
- select
- 并發安全
- 練習題
- 第三方庫
- Survey
- cobra