// Formatter 用於實現對象的自訂格式輸出
type Formatter interface {
// Format 用來處理當對象遇到 c 標記時的輸出方式(c 相當於 %s 中的 s)
// f 用來擷取預留位置的寬度、精度、擴充標記等資訊,同時實現最終的輸出
// c 是要處理的標記
Format(f State, c rune)
}
// State 用來擷取預留位置的狀態,包括寬度、精度、擴充標記等資訊
// 同時實現格式化後的字串的輸出
type State interface {
// Write 用於將格式化後的字串輸出到指定的對象
// 根據 Print 函數(Fprintf,Printf,Sprintf)的不同,輸出到不同的地方
Write(b []byte) (ret int, err error)
// Width 返回預留位置的寬度值(wid)和寬度是否被設定(ok)
Width() (wid int, ok bool)
// Precision 返回預留位置的精度值(prec)和精度是否被設定(ok)
Precision() (prec int, ok bool)
// Flag 返回擴充標記 c(一個字元,比如 %#s 中的 #)是否已被設定
Flag(c int) bool
}
type Stringer interface {
// String 擷取對象的文本形式
String() string
}
type GoStringer interface {
// GoString 擷取對象的 Go 文法文本形式(以 %#v 格式輸出的文本)
GoString() string
}
// Fscanf 用於掃描 r 中的資料,並根據 format 指定的格式
// 將掃描出的資料填寫到參數列表 a 中
// 當 r 中的資料被全部掃描完畢或掃描長度超出 format 指定的長度時
// 則停止掃描(分行符號會被當作空格處理)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
func main() {
s := strings.NewReader("我的名字叫 Golang ,今年 4 歲")
var name string
var age int
// 注意:這裡必須傳遞指標 &name, &age
// 要擷取的資料前後必須有空格
fmt.Fscanf(s, "我的名字叫 %s ,今年 %d 歲", &name, &age)
fmt.Printf("%s %d", name, age)
// Golang 4
}
// Scanf 用於掃描 os.Stdin 中的資料,並根據 format 指定的格式
// 將掃描出的資料填寫到參數列表 a 中
// 當 r 中的資料被全部掃描完畢或者掃描長度超出 format 指定的長度時
// 則停止掃描(分行符號會被當作空格處理)
func Scanf(format string, a ...interface{}) (n int, err error)
func main() {
var name string
var age int
// 注意:這裡必須傳遞指標 &name, &age
// 要擷取的資料前後必須有空格
fmt.Scanf("%s %d", &name, &age)
// 在控制台輸入:Golang 4
fmt.Printf("我的名字叫 %s ,今年 %d 歲", name, age)
// 我的名字叫 Golang ,今年 4 歲
}
// Sscanf 用於掃描 str 中的資料,並根據 format 指定的格式
// 將掃描出的資料填寫到參數列表 a 中
// 當 r 中的資料被全部掃描完畢或者掃描長度超出 format 指定的長度時
// 則停止掃描(分行符號會被當作空格處理)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
func main() {
s := "我的名字叫 Golang ,今年 4 歲"
var name string
var age int
// 注意:這裡必須傳遞指標 &name, &age
// 要擷取的資料前後必須有空格
fmt.Sscanf(s, "我的名字叫 %s ,今年 %d 歲", &name, &age)
fmt.Printf("%s %d", name, age)
// Golang 4
}