首次提交:初始化项目代码
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
// SafeWriter 线程安全的Writer封装
|
||||
type SafeWriter struct {
|
||||
writer *os.File
|
||||
mu sync.Mutex // 互斥锁,保护Writer写入
|
||||
}
|
||||
|
||||
// NewSafeWriter 创建SafeWriter实例
|
||||
func NewSafeWriter(filename string) (*SafeWriter, error) {
|
||||
file, err := os.OpenFile(filename,
|
||||
os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &SafeWriter{writer: file}, nil
|
||||
}
|
||||
|
||||
// Writef 线程安全的格式化写入
|
||||
func (w *SafeWriter) Writef(format string, args ...interface{}) error {
|
||||
w.mu.Lock() // 加锁,独占写入权
|
||||
defer w.mu.Unlock() // 函数退出自动解锁
|
||||
|
||||
// 拼接日志前缀(时间)+ 格式化内容
|
||||
logContent := fmt.Sprintf("[%s] %s\n",
|
||||
time.Now().Format("2006-01-02 15:04:05"),
|
||||
fmt.Sprintf(format, args...))
|
||||
|
||||
// 写入文件(用WriteString比Fprintf更高效)
|
||||
_, err := w.writer.WriteString(logContent)
|
||||
return err
|
||||
}
|
||||
|
||||
// Close 关闭文件
|
||||
func (w *SafeWriter) Close() error {
|
||||
return w.writer.Close()
|
||||
}
|
||||
|
||||
func main() {
|
||||
writer, err := NewSafeWriter("concurrent.log")
|
||||
if err != nil {
|
||||
fmt.Printf("SafeWriter创建失败:%v\n", err)
|
||||
return
|
||||
}
|
||||
defer writer.Close()
|
||||
|
||||
var wg sync.WaitGroup
|
||||
// 10个goroutine并发写入(每个写10条)
|
||||
for i := 0; i < 10; i++ {
|
||||
wg.Add(1)
|
||||
go func(goroutineID int) {
|
||||
defer wg.Done()
|
||||
for j := 0; j < 10; j++ {
|
||||
writer.Writef("goroutine%d:完成第%d条任务", goroutineID, j)
|
||||
}
|
||||
}(i)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
fmt.Println("10个goroutine并发写入完成,内容无错乱")
|
||||
}
|
||||
Reference in New Issue
Block a user