摘要:
func Producer(factor int, out chan<- int) { for i := 0; ; i++ { out <- i*factor } } func Consumer(in <-chan int) { for v := range in { fmt.Println(v) 阅读全文
摘要:
通过关闭channel来广播消息 waitgroup的目的,是在main关闭channel后,给goroutine一些时间,完成某些操作 func worker(wg *sync.WaitGroup, cannel chan bool) { defer wg.Done() for { select 阅读全文
摘要:
ch := make(chan struct{}) for _, f := range filenames { go func(f string) { ..... ch <- struct{}{} }(f) } for range filenames { <-ch } // 等待goroutine执 阅读全文
摘要:
for _, filename := range filenames { f, err := os.Open(filename) if err != nil { return err } defer f.Close() // 会打开大量的文件 ...... } for _, filename := 阅读全文
摘要:
var sem = make(chan int, 100) // func handle(r *Request) { sem <- 1 process(r) // 可以控制 process 的并发数 <-sem } func Serve(queue chan *Request) { for { re 阅读全文
摘要:
reflect.Type reflect.Value v := reflect.TypeOf(3) // 接受interface{},返回reflect.Type类型的值,该值包含参数的动态类型 fmt包的%T参数,使用reflect.TypeOf来输出 v := reflect.ValueOf(3 阅读全文
摘要:
Ticker tick在不使用时,应手动stop,否则会造成timer泄露 func Tick(d Duration) <-chan Time func NewTicker(d Duration) *Ticker func (t *Ticker) Stop() for t := range time 阅读全文
摘要:
sync包里的对象,大多是不能复制的 锁 sync.Mutex的Lock()方法,是不能重入的 var mu sync.Mutex // 零值表示未被锁定的互斥量 mu.Lock() defer mu.Unlock() // 对未锁定的锁进行Unlock,会导致panic var mu sync.R 阅读全文
摘要:
用join代替子查询,join也尽量少用 join用小的结果集驱动大的结果集,第二个表要建索引, mysql会用第一张表的每条数据去第二张表中查找 尽量定义成not null,并设置默认值 只有一行数据满足条件,要使用limit 1,找到后就停止 列不要太多,指定需要的列,避免select * in 阅读全文
摘要:
数据类型越小越好,越简单越好, 整型比字符串好,ip可以转为整型, 整型比浮点型好,金额可以乘以一个倍数,转为整型 内置的日期和时间类型比char好,timestamp比datetime好 少用text类型 数据类型 varchar(M)表示最长M个字符,M<=65535,每个值占用实际字节数+1或 阅读全文