关于使用log与使用fmt的区别

最初的就是直接打印出来,之后一点点升级,比如加上输出的时间,加上goroutine之间的并发操作(打印信息并不能一定按照你规定好的顺序输出来 每次输出的顺序可能会不同),按照不同的日志级别进行打印 。。。加上打印以及转存,因此就需要专门的log包来记录程序的信息。

想象一下,一个很大的项目有很多的输出信息,要是输出信息前面没有加上日期的话,debug起来几乎是难以想象的,因为不可能一直盯着屏幕来对信息进行监控。

因此采用log来代替fmt的原因主要有一下几个方面:

  • 添加了输出时间
  • 线程安全
  • 方便对日志信息进行转存,形成日志文件

关于logger的基本结构,可以参考这个博客:
http://gotaly.blog.51cto.com/8861157/1406905

看logger的结构,除了基本的信息之外,还有许多其他的功能:
http://studygolang.com/articles/3383

具体理解log是线程安全的,可以参考这个博客:
http://blog.csdn.net/paladinosment/article/details/42666147

还有日志的转存打印
创建New对象的时候,通过控制第一个参数,可以直接输出到标准输出上,也可以存到文件中。

如果仅仅想输出到终端,可以直接调用log.XXX方法,不用先生成一个logger对象,再去通过logger对象来调用。在log包中,有一些methods是直接对logger的实现,有一些是直接的库函数,可以直接使用。

http://www.sharejs.com/codes/go/7308

关于单元测试时候的t.logf
这个在内部其实还是使用类似的logs的方法,都是对基本的并行的操作进行了封装之后再处理的,加上了mutex操作,因此在单元测试中也并不推荐直接使用fmt.printf的方法。

Golang中log与fmt区别的更多相关文章

  1. golang中new和make区别

    golang 中有两个内存分配机制 :new和make,二者有明显区别. new:用来初始化一个对象,并且返回该对象的首地址.其自身是一个指针.可用于初始化任何类型 make:返回一个初始化的实例,返 ...

  2. 深入学习golang中new与make区别

    Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives).对于初学者,这两者的区别也挺容易让人迷糊的.简单的说,new只分配内存,make用于slic ...

  3. golang中sync.RWMutex和sync.Mutex区别

    golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex     f ...

  4. golang 你所不知道的 log 和 fmt

    直接点说,就是由于fmt 是线程不安全的, 如果你在多协程场景下使用fmt打印信息可能会得到乱序的结果 就是说 不按代码里的顺序打印. 下面看示例 代码示例 golang fmt 多线程 乱序: fu ...

  5. golang中,new和make的区别

    在golang中,make和new都是分配内存的,但是它们之间还是有些区别的,只有理解了它们之间的不同,才能在合适的场合使用. 简单来说,new只是分配内存,不初始化内存: 而make即分配又初始化内 ...

  6. golang中数组指针与指针数组的区别实现

      指针数组和数组的指针,指的是两个不同的东西. 指针数组是有指针组成的数组,数组的指针是一个数组的指针. package main import "fmt" const MAX ...

  7. Go实战--golang中使用JWT(JSON Web Token)

    http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cook ...

  8. golang中Context的使用场景

    golang中Context的使用场景 context在Go1.7之后就进入标准库中了.它主要的用处如果用一句话来说,是在于控制goroutine的生命周期.当一个计算任务被goroutine承接了之 ...

  9. 说说不知道的Golang中参数传递

    本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为.在golang中存在着m ...

随机推荐

  1. python基础练习题7

    1.创建Person类,属性有姓名.年龄.性别,创建方法personInfo,打印这个人的信息2.创建Student类,继承Person类,属性有学院college,班级class,重写父类perso ...

  2. windows中ftp下载脚本(bat+vb)

    做了个ftp下载脚本: ftpdownload.bat @rem 注释:从ftp服务器每小时下载北向性能文件的脚本 @rem 用vb脚本取昨天 for /f %%a in ('cscript //no ...

  3. 那些年我写过的mysql命令

    建表语句 #mysql5.7适用create table testfy ( id int primary key AUTO_INCREMENT, clipid int comment '影片编号', ...

  4. Codeforces Round #569 (Div. 2) B. Nick and Array

    链接: https://codeforces.com/contest/1180/problem/B 题意: Nick had received an awesome array of integers ...

  5. JAVA笔记14-线程

    一.概念 线程:是一个程序里面不同的执行路径,每一个分支都叫线程.到现在为止我们所讲的程序分支只有一个,即main方法,称作主线程. 进程:class文件,exe文件.程序的执行过程:程序放入代码区( ...

  6. 破解wifi_失败

    sudo apt install reaver aircrack-ng //安装需要的软件包ifconfig //获取本地网卡接口sudo airmon-ng start wlp3s0 //无线网卡设 ...

  7. .net reactor 加密混淆使用办法

    https://www.cnblogs.com/bile/p/10250888.html 概述:安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.chm,目前没 ...

  8. leaflet 地图容器大小改变时,地图自适应新容器

    window.onload = function () { changeDivHeight(); } //当浏览器窗口大小改变时,设置显示内容的高度 window.onresize = functio ...

  9. asp.net+批量下载附件

    asp.net 下载文件几种方式 protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新的方 ...

  10. BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着 ...