Darigaaz的回答适用于单一的goroutine,但收盘封闭通道恐慌(而你也不必在实例中waitgroup)。如果您有多个够程,并希望循环退出所有的人都完成之后,使用waitgroup有接近常规:

package main 

import (
    "fmt" 
    "sync" 
    "time" 
) 

func main() { 
    var wg sync.WaitGroup 
    quitCh := make(chan struct{}) 

    for i := 1; i <= 5; i++ { 
     wg.Add(1) 
     go func(i int) { 
      count := 1 
      t := time.NewTicker(time.Millisecond) 
      for count <= 5 { 
       fmt.Printf("Goroutine %v iteration %v\n", i, count) 
       count++ 
       <-t.C 
      } 
      wg.Done() 
     }(i) 
    } 

    // This is the closer routine. 
    go func() { 
     wg.Wait() 
     close(quitCh) 
    }() 

    t := time.NewTicker(500 * time.Microsecond) 
loop: 
    for i := 1; ; i++ { // this is still infinite 
     select { 
     case <-quitCh: 
      break loop // has to be named, because "break" applies to the select otherwise 
     case <-t.C: 
      fmt.Println("Main iteration", i) 
     } 
    } 
    fmt.Println("End!") 

} 

作为替代到指定的循环风格,可以而是使用该选择中的突破性突破:

for i := 1; ; i++ { // this is still infinite 
     select { 
     case <-quitCh: 
      // fallthrough 
     case <-t.C: 
      fmt.Println("Main iteration", i) 
      continue 
     } 
     break // only reached if the quitCh case happens 
    }