| 
                         sync实例:  
package main
  import (  "fmt"  "sync" )
  var waitgroup sync.WaitGroup
  func Afunction(shownum int) {  fmt.Println(shownum)  waitgroup.Done() //任务完成,将任务队列中的任务数量-1,其实.Done就是.Add(-1) }
  func main() {  for i := 0; i < 10; i++ {  waitgroup.Add(1) //每创建一个goroutine,就把任务队列中任务的数量+1  go Afunction(i)  }  waitgroup.Wait() //.Wait()这里会发生阻塞,直到队列中所有的任务结束就会解除阻塞 }  
无缓存的channel实例:  
package main
  import "fmt"
  func Afuntion(ch chan int) {  fmt.Println("finish")  <-ch }
  func main() {  ch := make(chan int) //无缓冲的channel  go Afuntion(ch)  ch <- 1
   // 输出结果:  // finish }  
 
有缓存的channel实例:  
package main
  import "fmt"
  func main() {  var ch = make(chan int,20)  for i := 0; i < 10; i++ {  ch <- i  }  close(ch)  //ch <- 11 //panic: runtime error: send on closed channel  for i := range ch {  fmt.Println(i) //输出0 1 2 3 4 5 6 7 8 9  } }
   
超时处理channel实例:  
package main import ( "fmt" "time")func main() { c := make(chan int) o := make(chan bool) go func() { for { select { case i := <-c: fmt.Println(i) case <-time.After(time.Duration(3) * time.Second): //设置超时时间为3s,如果channel 3s钟没有响应,一直阻塞,则报告超时,进行超时处理. fmt.Println("timeout") o <- true break } } }() <-o}                         (编辑:李大同) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |