想要從外部終止一個正在執行中或無限迴圈的goroutine,必須使用channel將中斷訊息傳入使之中斷

建立Channel

使用chan關鍵字宣告為channel,並指定通道類型

ch := make(chan struct{})

若要傳入channel多個值,則必須指定buffer的大小,否則會造成deadlock

ch := make(chan struct{},10)//buffer大小為10

設定目標函式的參數

func main(){
    ch := make(chan struct{})
    go spinner(80*time.Millisecond, ch)
}

func spinner(delay time.Duration, ch chan struct{}) {

}

使用select case控制流程

select case只能用在有關channel的操作上,若多個case都符合,則會隨機挑選一個執行,若都不符合則執行default

func main(){
    ch := make(chan struct{})
    go spinner(80*time.Millisecond, ch)
}

func spinner(delay time.Duration, ch chan struct{}) {
    for {
        select {
        case <-ch:
            return
        default:
            for _, r := range `-\|/` {
                fmt.Printf("\r%c", r)
                time.Sleep(delay)
            }
        }
    }
}

結束goroutine

在要中斷的地方插入close(ch)以關閉channel

func main(){
    ch := make(chan struct{})
    go spinner(80*time.Millisecond, ch)
    close(ch)
}

func spinner(delay time.Duration, ch chan struct{}) {
    for {
        select {
        case <-ch:
            return
        default:
            for _, r := range `-\|/` {
                fmt.Printf("\r%c", r)
                time.Sleep(delay)
            }
        }
    }
}