我的程序中有多个 goroutine,每个 goroutine 都会调用
fmt.Println
,而无需任何显式同步。这是否安全(即,每一行都会单独显示而不会损坏数据),还是我需要创建另一个具有同步功能的 goroutine 专门处理打印?
不,尽管您有时可能没有观察到任何问题,但它并不安全。 IIRC,fmt 包试图保持安全,因此可能会发生某种混合,但希望不会出现进程崩溃。
这是一个更通用的 Go 文档规则的实例:除非另有说明或从上下文中显而易见,否则并发访问是不安全的。
使用日志包和一些小的初始设置,可以拥有 fmt.Print* 功能的一个很好的子集的安全版本。
常用方法(fmt.printLine)并不安全。不过,还是有方法的。
log.Logger 是“goroutine 安全的”:https://golang.org/pkg/log/#Logger
这样的东西将创建一个标准输出记录器,可以在任何 go 例程中安全地使用。
logger := log.New(os.Stdout, "", 0)