Pergunta

Todos os exemplos que vi até agora envolvem o bloqueio para obter o resultado (através do <-chan operador).

Minha abordagem atual envolve passar um ponteiro para uma estrutura:

type goresult struct {
    result resultType;
    finished bool;
}

que a goroutina escreve após a conclusão. Então é uma questão simples de verificar finished sempre que conveniente. Você tem alternativas melhores?

O que realmente estou buscando é um sistema de sinalização no estilo QT. Eu tenho um palpite, a solução parecerá quase trivial (chanbarbear grande quantidade de potencial inexplorado), mas ainda não estou familiarizado o suficiente com o idioma para descobrir.

Foi útil?

Solução

Você pode usar o padrão "vírgula, ok" (veja a página deles em "vá eficaz"):

foo     := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.

Outras dicas

Selecione instruções permite que você verifique vários canais de uma só vez, tomando uma filial aleatória (daqueles em que a comunicação está esperando):

func main () {
    for {
    select {
        case w := <- workchan:
            go do_work(w)
        case <- signalchan:
            return
        // default works here if no communication is available
        default:
            // do idle work
    }
    }
}

Para todas as expressões de envio e recebimento na instrução "Select", as expressões de canal são avaliadas, juntamente com quaisquer expressões que apareçam no lado direito das expressões de envio, em ordem de cima para baixo. Se alguma das operações resultantes puder prosseguir, uma é escolhida e a comunicação e as declarações correspondentes serão avaliadas. Caso contrário, se houver um caso padrão, isso será executado; Caso contrário, a declaração bloqueia até que uma das comunicações possa ser concluída.

Você também pode espiar o buffer de canal para ver se ele contém alguma coisa usando LEN:

if len(channel) > 0 {
  // has data to receive
}

Isso não tocará o buffer de canal, diferentemente foo, gotValue := <- ch que remove um valor quando gotValue == true.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top