漫談golang之fmt格式化模塊

fmt 漫談

Go Walkthrough: fmtlinux

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)
}

結果:api

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包能夠使用code

相關文章
相關標籤/搜索