- 传递参数的时候不传递interface而传递具体类型
- 不适用io.Writer & io.Reader, 而使用具体类型(和第一点有点重复了)
- 传递一个很大的interface,应该传递只需要用到的interface
- 什么时候用函数什么时候用方法:当需要状态或者修改状态的时候使用方法,如果只是逻辑,则使用函数。
- pointer receiver还是value receiver。指针receiver可以修改receiver,但是并发是不安全的,value receiver不能修改receiver,并发安全,但是传递value有资源的拷贝
- 把erros当成strings
func findServiceById(id uint) (s *service, err error) {
h.dicMutex.Lock()
defer h.dicMutex.Unlock()
s, ok := h.dic[id]
if !ok {
err = erros.New("service is not find.")
}
return s, err
}
这样写了在外面就没法进行比较,所以应该这样写
ServiceNotFindError = errors.New("service is not find.")
func findServiceById(id uint) (s *service, err error) {
h.dicMutex.Lock()
defer h.dicMutex.Unlock()
s, ok := h.dic[id]
if !ok {
err = ServiceNotFindError
}
return s, err
}
- 并发安全还是不安全,设计API的时候要考虑是否需要并发安全的问题。安全需要消耗一些性能,但是用户用起来可能会更方便,因为用户不需要再去考虑并发安全;不安全则需要用户自己去考虑是否需要并发安全。