go标准库源码-log模块

前言

log模块的源码比较简单,适合作为学习go标准库源码的开端。

Logger类型结构

type Logger struct {
    mu     sync.Mutex // ensures atomic writes; protects the following fields
    prefix string     // prefix to write at beginning of each line
    flag   int        // properties
    out    io.Writer  // destination for output
    buf    []byte     // for accumulating text to write
}
    1. out log输出的目的

构造函数

func New(out io.Writer, prefix string, flag int) *Logger {
    return &Logger{out: out, prefix: prefix, flag: flag}
}

std 全局变量

var std = New(os.Stderr, "", LstdFlags)

std为非导出的全局变量,只能通过Printf Println等方法使用。

Printf Println

// Printf calls Output to print to the standard logger.
// Arguments are handled in the manner of fmt.Printf.
func Printf(format string, v ...interface{}) {
    std.Output(2, fmt.Sprintf(format, v...))
}

// Println calls Output to print to the standard logger.
// Arguments are handled in the manner of fmt.Println.
func Println(v ...interface{}) {
    std.Output(2, fmt.Sprintln(v...))
}

func Fatal(v ...interface{}) {
    std.Output(2, fmt.Sprint(v...))
    os.Exit(1)
}

这两个方法都使用std 作为logger

总结

log模块代码比较简单,但是通过源码的学习基本可以看出go中一个模块的组织形式。

  • 1.首先定义核心的模型,Logger, 通常是导出的。 这样便于使用方定制结构的内容。

    1. 提供构造方法 ,通常为New 参数应该是常用的属性。如果使用需要设置其他属性,可以直接使用 导出的模型定义。
    1. 创建一个默认的对象,通常是非导出的 ,提供后面的方法使用。
    1. 创建一些导出方法,这些方法会使用默认对象的相应方法实现。这样对于想使用默认配置的使用者,可以通过直接调用这些方法实现。 而不需要创建对象。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Go 标准库介绍六: log 原文链接 http://ironxu.com/775 本文介绍Go 标准库 log ...
    好刚编程阅读 5,682评论 0 3
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 7,602评论 0 3
  • 在我们开发程序后,如果有一些问题需要对程序进行调试的时候,日志是必不可少的,这是我们分析程序问题常用的手段。 日志...
    豆瓣奶茶阅读 18,411评论 0 22
  • 原文使用有道云笔记创作, 看这个获取更好阅读体验: 有道云笔记原创连接[http://note.youdao.c...
    moasm阅读 15,967评论 4 10
  • btcd 中使用的log 模块引用自己项目仓库的btclog包。 在整个包里面,定义了需要实现的接口,以及简单的封...
    qishuai阅读 3,573评论 0 0