func test() {for i := 0; i < 10; i++ {fmt.Println("test()", i)time.Sleep(time.Millisecond * 100)}wg.Done()
}var wg sync.WaitGroupfunc main() {wg.Add(1)go test()for i := 0; i < 10; i++ {fmt.Println("main()", i)time.Sleep(time.Millisecond * 20)}wg.Wait()
}
通过 go 开始携程
通过sync.WaitGroup 使得主线程进行等待
func test(num int) {defer wg.Done()for i := 0; i < 10; i++ {fmt.Println("test()", num)time.Sleep(time.Millisecond * 100)}
}var wg sync.WaitGroupfunc main() {for i := 0; i < 6; i++ {wg.Add(1)go test(i)}wg.Wait()
}
获取执行时间end:=time.Now.Unix() start=... end-start为执行的毫秒数
定义管道,先进先出,为引用数据类型
func main() {ch := make(chan int, 3)ch <- 10a := <-chfmt.Println(a)fmt.Printf("%v,%v,%v", ch, cap(ch), len(ch))
}
forr遍历,注意遍历前需要关闭,否则报错,通过for循环可以不关闭
func main() {ch := make(chan int, 3)ch <- 10close(ch)for v := range ch {fmt.Println(v)}
}
只写的管道
func main() {ch := make(chan<-int, 3)ch <- 10close(ch)}
只读的管道
func main() {ch := make(<-chan int, 3)for v := range ch {fmt.Println(v)}
}
select多路复用,一定要注意不要关闭管道,否则会报错
func main() {intChan := make(chan int, 10)for i := 0; i < 10; i++ {intChan <- i}strChan := make(chan string, 10)for i := 0; i < 10; i++ {strChan <- "hello" + fmt.Sprintf("%d", i)}for {select {case v := <-intChan:fmt.Println(v)case v := <-strChan:fmt.Println(v)default:fmt.Println("finish")return}}
}
加互斥锁
var mutex sync.Mutexmutex.Lock()mutex.Unlock()
读写锁
var mutex sync.RWMutexmutex.Lock()mutex.Unlock()mutex.RLock()mutex.RUnlock()