上卷 程序设计
中卷 标准库
- bufio 1.18
- bytes 1.18
- io 1.18
- container 1.18
- encoding 1.18
- crypto 1.18
- hash 1.18
- index 1.18
- sort 1.18
- context 1.18
- database 1.18
- connection
- query
- queryrow
- exec
- prepare
- transaction
- scan & null
- context
- tcp
- udp
- http
- server
- handler
- client
- h2、tls
- url
- rpc
- exec
- signal
- embed 1.18
- plugin 1.18
- reflect 1.18
- runtime 1.18
- KeepAlived
- ReadMemStats
- SetFinalizer
- Stack
- sync 1.18
- atomic
- mutex
- rwmutex
- waitgroup
- cond
- once
- map
- pool
- copycheck
- nocopy
- unsafe 1.18
- fmt 1.18
- log 1.18
- math 1.18
- time 1.18
- timer
下卷 运行时
源码剖析
- 1. 初始化
- 2. 内存分配
- 3. 垃圾回收
- 4. 并发调度
- 5. 通道
- 6. 延迟调用
- 7. 终结器
- 8. 其他
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
log 1.18
轻量级日志记录器。
Print
Panic
:Print + panic
Fatal
:Print + os.Exit(1)
func main() { l := log.New(os.Stdout, "[demo] ", log.Ldate | log.Lshortfile) l.Println("hello world") }
源码剖析
默认输出的 Stderr
,可通过 SetOutput
修改。
// log.go var std = New(os.Stderr, "", LstdFlags) func Default() *Logger { return std } func SetOutput(w io.Writer) { std.SetOutput(w) } func Print(v ...any) { std.Output(2, fmt.Sprint(v...)) }
内部实现并发安全。
type Logger struct { mu sync.Mutex prefix string flag int out io.Writer buf []byte isDiscard int32 }
func (l *Logger) Print(v ...any) { if atomic.LoadInt32(&l.isDiscard) != 0 { return } l.Output(2, fmt.Sprint(v...)) } func (l *Logger) Fatal(v ...any) { l.Output(2, fmt.Sprint(v...)) os.Exit(1) } func (l *Logger) Output(calldepth int, s string) error { l.mu.Lock() defer l.mu.Unlock() if l.flag & (Lshortfile|Llongfile) != 0 { l.mu.Unlock() // 忽略 Print/Fatal + Output,获取用户调用帧。 _, file, line, ok = runtime.Caller(calldepth) l.mu.Lock() } l.formatHeader(&l.buf, now, file, line) l.buf = append(l.buf, s...) // 自行补上换行。 if len(s) == 0 || s[len(s)-1] != '\n' { l.buf = append(l.buf, '\n') } _, err := l.out.Write(l.buf) return err }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论