面试题答案
一键面试优化思路
- 使用
sync.Mutex
:在日志写入操作时加锁,防止多个协程同时写入日志导致格式混乱。 - 使用
sync.WaitGroup
:在需要等待所有日志相关操作完成的场景下,用于协调多个协程。
关键代码片段
package main
import (
"fmt"
"sync"
)
var (
mu sync.Mutex
wg sync.WaitGroup
logCh = make(chan string)
)
func logWriter() {
defer wg.Done()
for logMsg := range logCh {
mu.Lock()
// 这里按照自定义格式进行日志输出,假设自定义格式是简单的前缀+消息
fmt.Printf("[CustomFormat] %s\n", logMsg)
mu.Unlock()
}
}
func main() {
wg.Add(1)
go logWriter()
for i := 0; i < 10; i++ {
logMsg := fmt.Sprintf("log message %d", i)
logCh <- logMsg
}
close(logCh)
wg.Wait()
}
在上述代码中:
sync.Mutex
mu
用于保护日志写入操作,在每次写入日志前加锁,写入后解锁,确保同一时间只有一个协程能进行日志写入。sync.WaitGroup
wg
用于等待日志写入协程完成所有日志处理。logCh
是一个通道,用于将日志消息传递给日志写入协程,解耦日志产生和日志写入操作,提高并发性能。