fmt 漫談
Go Walkthrough: fmt
fmt常用的格式化字元串
- %v 是個通用的占位符。它會自動将變量轉換為預設格式的字元串,這在列印字元串或數字等原語時非常有用,而且不需要特定的選項
- %#v 根據go文法列印。尤其在列印struct和切片時特别直覺
package main
import (
"fmt"
)
//1
var brand = "ALIENWARE"
type computer struct {
name string
price float32
config []string
brand *string
}
func main() {
myComputer := computer{"tktk", 18000.00, []string{"i7 9700k", "RTX 2080Ti", "DDR4 32G"}, &brand}
fmt.Printf("my computer is: \n%#v\n", myComputer)
fmt.Printf("my computer is: \n%v\n", myComputer)
}
結果:
go version go1.12 linux/amd64
my computer is:
main.computer{name:"tktk", price:18000, config:[]string{"i7 9700k", "RTX 2080Ti", "DDR4 32G"}, brand:(*string)(0x5531b0)}
my computer is:
{tktk 18000 [i7 9700k RTX 2080Ti DDR4 32G] 0x5531b0}
}
- %T 列印變量的類型
- %d 列印10進制整數
- %x和%X 列印16進制整數
- %f 列印浮點數,可以通過%8.2f,%-8.2f,%08.2f,% f等來控制列印字元串的空格
- %q 能列印加引号的字元串。當您的資料可能有不可見字元(如空字元串)時,這是有用的,因為引用的字元串将它們列印為轉義序列。
- %p 列印變量的指針位址。當您正在調試代碼并且希望檢查不同的指針變量是否引用相同的資料時,這個方法非常有用。
fmt Printing
FMT包的主要用途是格式化字元串。這些格式化函數按其輸出類型-STDOUT、io.Writer和String進行分組。
- 列印到stdout
// 按照預設格式列印一系列變量
func Print(a ...interface{}) (n int, err error)
// 相比Print,在變量之間插入了空格,并最後添加上換行符
func Println(a ...interface{}) (n int, err error)
// 根據自定義格式化字元串,能列印不同格式的輸出
func Printf(format string, a ...interface{}) (n int, err error)
- 列印到io.Writer
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)
Fprint是更通用的形式,print僅僅是Fprint(os.Stdout, "Hello World!")的包裝
- 格式為字元串
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string
當大量采用Sprint産生字元串,會産生瓶頸問題。
- Errorf()
func Errorf(format string, a ...interface{}) error {
return errors.New(Sprintf(format, a...))
}
Scanning
fmt包也有從stdin,io.Reader, string讀取并格式化的api。
- 從stdin讀取
func Scan(a ...interface{}) (n int, err error)
func Scanf(format string, a ...interface{}) (n int, err error)
func Scanln(a ...interface{}) (n int, err error)
- 從io.Reader讀取
func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
- 從string讀取
func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
var name string
var age int
if _, err := fmt.Scan(&name, &age); err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("Your name is: %s\n", name)
fmt.Printf("Your age is: %d\n", age)
執行互動
$ go run main.go
Jane 25
Your name is: Jane
Your age is: 25
總之,如果從指令行讀取并解析到指定的interface,如例子中的name,age,我們有更好用的flag包可以使用