零值 sync.Mutexsync.RWMutex 是有效的。所以指向 mutex 的指针基本是不必要的。

    1. var mu sync.Mutex
    2. mu.Lock()

    Channel 的 size 要么是 1,要么是无缓冲的

    枚举从 1 开始

    1. type Operation int
    2. const (
    3. Add Operation = iota + 1
    4. Subtract
    5. Multiply
    6. )

    使用 time.Time 表达瞬时时间

    在处理时间的瞬间时使用 [time.Time](https://golang.org/pkg/time/#Time),在比较、添加或减去时间时使用 time.Time 中的方法。

    1. func isActive(now, start, stop time.Time) bool {
    2. return (start.Before(now) || start.Equal(now)) && now.Before(stop)
    3. }

    在尽可能的情况下,在初始化要追加的切片时为make()提供一个容量值。

    优先使用 strconv 而不是 fmt

    包命名

    • 全部小写。没有大写或下划线。
    • 大多数使用命名导入的情况下,不需要重命名。
    • 简短而简洁。请记住,在每个使用的地方都完整标识了该名称。
    • 不用复数。例如net/url,而不是net/urls
    • 不要用“common”,“util”,“shared”或“lib”。这些是不好的,信息量不足的名称。

    嵌入式类型(例如 mutex)应位于结构体内的字段列表的顶部,并且必须有一个空行将嵌入式字段与常规字段分隔开。

    不应明确返回长度为零的切片。应该返回nil 来代替。

    要检查切片是否为空,请始终使用len(s) == 0。而非 nil