Go 取消上下文。是否多次取消上下文?

Go 取消上下文。是否多次取消上下文?,go,goroutine,cancellation,tui,Go,Goroutine,Cancellation,Tui,我正在使用Go中的控制台音乐播放器。每当用户选择并播放一张专辑时,我都会在播放列表上启动一个goroutine到循环 playlist := make([]*Media, 0) for _, path := range album.Paths { media, err := NewMediaFromPath(path) // return err playlist = append(playlist, media) } for idx := range playlis

我正在使用
Go
中的控制台音乐播放器。每当用户选择并播放一张专辑时,我都会在播放列表上启动一个goroutine到循环

playlist := make([]*Media, 0)
for _, path := range album.Paths {
    media, err := NewMediaFromPath(path)
    // return err

    playlist = append(playlist, media)
}

for idx := range playlist {
    player.SetMedia(playlist[idx])
    err = player.Play()
    // check err

    status, err := player.MediaState()
    // check err

    for status != MediaEnded && status != MediaStopped {
        // update UI and check player status
        // loop until the song finishes
        status, err = player.MediaState()
    }
}
当用户选择一张新专辑时,我需要一种方法来取消这个goroutine。我使用的是
context.context
(但我不认为这是最好的解决方案)

我创建了
ctx

    ctx, cancel := context.WithCancel(context.Background())
因此,在UI事件处理程序中,
play()
func
cancel()
goroutine

当我检查更新UI
中的
循环时,这会起作用:

        select {
        case <-ctx.Done():
            return err
        default:
            time.Sleep(50 * time.Millisecond)
        }

但是我得到了一个
sync:WaitGroup被重用,在之前的等待返回之前
panic

使用通道取消goroutine怎么样

select {
case <-chClose:
    return
default:
}
但是你不能再关上它!所以你需要确保你的新专辑有一个新的结尾。根据您的代码结构,这可能是更干净的解决方案

或者,您只需在chClose上发送一个值,即可启动停止go例程:

chClose <- 1
chClose您需要一个干净的体系结构!!)

close(chClose)
chClose <- 1