从log.go(日志包的实现):
167 // Println calls l.Output to print to the logger.
168 // Arguments are handled in the manner of fmt.Println.
169 func (l *Logger) Println(v ...interface{}) { l.Output(2, fmt.Sprintln(v...)) }
Run Code Online (Sandbox Code Playgroud)
log.Println仅仅是一个功能包装的fmt.Sprintln,我为什么要使用它,而不是fmt.Println或fmt.Sprintln?
任何实际的原因?
下面的代码不会引发数据竞争
package main
import (
"fmt"
"os"
"strings"
)
func main() {
x := strings.Repeat(" ", 1024)
go func() {
for {
fmt.Fprintf(os.Stdout, x+"aa\n")
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+"bb\n")
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+"cc\n")
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+"dd\n")
}
}()
<-make(chan bool)
}
Run Code Online (Sandbox Code Playgroud)
我尝试了多种长度的数据,变体https://play.golang.org/p/29Cnwqj5K30
这篇文章说它不是TS。
这封邮件并没有真正回答问题,或者我没有理解。
os和fmt 的包文档对此没有太多提及。我承认我没有挖掘这两个包的源代码来找到进一步的解释,它们对我来说太复杂了。
有哪些建议和参考?