初探 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 实际是可以从内存缓存中读取数据的,而且这个调用是加了锁的,需要注意。

分享:

评论