初探 Go 中 Fprintln 实现


通过 Fprintln 输出:

package main

import "fmt"

func main() {
    fmt.Println("This is test.")
}

输出如下:

This is test.

看源码。

func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
      p := newPrinter()
      p.doPrintln(a)
      n, err = w.Write(p.buf)
      p.free()
      return
}

实际是调用了 newPrinter()。
再看源码。

// newPrinter allocates a new pp struct or grabs a cached one.
func newPrinter() *pp {
      p := ppFree.Get().(*pp)
      p.panicking = false
      p.erroring = false
      p.fmt.init(&p.buf)
      return p
}

再看源码。。

var ppFree = sync.Pool{
      New: func() interface{} { return new(pp) },
}

综上,Fprintln 实际是可以从内存缓存中读取数据的,而且这个调用是加了锁的,需要注意。

分享:

评论