- 不要省略
defer
- 总是关闭 http body
defer r.Body.Close()
- 过滤但不分配新内存
time.Time
有指针字段 time.Location
并且这对 go GC 不好
- 只有使用了大量的
time.Time
才(对性能)有意义,否则用 timestamp 代替
regexp.MustCompile
比 regexp.Compile
更好
- 在大多数情况下,你的正则表达式是不可变的,所以你最好在
func init
中初始化它
- 请勿在你的热点代码中过度使用
fmt.Sprintf
. 由于维护接口的缓冲池和动态调度,它是很昂贵的。
- 如果你正在使用
fmt.Sprintf("%s%s", var1, var2)
, 考虑使用简单的字符串连接。 - 如果你正在使用
fmt.Sprintf("%x", var)
, 考虑使用 hex.EncodeToString
or
- 如果你不需要用它,可以考虑丢弃它,例如
io.Copy(ioutil.Discard, resp.Body)
- HTTP 客户端的传输不会重用连接,直到body被读完和关闭。
res, _ := client.Do(req)
io.Copy(ioutil.Discard, res.Body)
- 不要在循环中使用 defer,否则会导致内存泄露
- 不要忘记停止 ticker, 除非你需要泄露 channel
- 用自定义的 marshaler 去加速 marshaler 过程
func (entry Entry) MarshalJSON() ([]byte, error) {
buffer := bytes.NewBufferString("{")
first := true
for key, value := range entry {
jsonValue, err := json.Marshal(value)
if err != nil {
return nil, err
}
if !first {
}
first = false
}
buffer.WriteString("}")
return buffer.Bytes(), nil
}
sync.Map
不是万能的,没有很强的理由就不要使用它。
-
-
- 对于最快的原子交换,你可以使用这个
m := (*map[int]int)(atomic.LoadPointer(&ptr))
-
-
for k := range m {
delete(m, k)