Os canais Go explicados como se fossem cinco

Quando comecei a trabalhar com o modelo de simultaneidade de Go, os canais pareciam misteriosos. Eu sabia que eles eram uma maneira de Goroutines conversarem entre si, mas os pontos mais refinados de como eles se comunicam e quando fechá -los ainda estavam confusos. Depois de experimentar um exemplo simples, agora tenho um modelo mental muito mais claro. 1. Os canais são oleodutos para comunicação que um canal em Go é como uma correia transportadora entre os goroutinos. Um remetente coloca valores no cinto. Um receptor tira valores da correia. Você pode pensar nisso: ch: = make (chan int) // um canal para valores int insair modo de tela cheia de saída de tela cheia agora ch está pronto para transportar dados int de uma goroutina para outra. 2 canais de remetente VS canais de receptor em Go, você pode marcar explicitamente o parâmetro de uma função como um canal somente de envio ou somente de recebimento: Chan <-int → canal somente de envio <-Chan Int → canal somente de recebimento Isso torna o modo intenção e impede o uso acidental. VS canais de sinalização, venho ver duas funções principais para canais: canais de dados: carregue informações reais (números, strings, estruturas etc.) entre os goroutines. Canais de sinalização: usado apenas para dizer “eu terminei” ou “você pode prosseguir”, geralmente carregando estrutura {} (uma estrutura vazia) para evitar custos extras de memória. Exemplo de um canal de sinalização: feito: = make (chan struct {}) go func () {// faça algum trabalho realizado <- struct {} {}} () <-done // aguarda o sinal Enter o modo de tela completa Sair do modo de tela completa 4. Por que fechar um canal é importante se o receptor está em um loop, ele precisa saber quando não há nada para saber quando não há nada para saber quando não há nada. Fechar um canal é a maneira do remetente de dizer: “Eu terminei de enviar. Não espere mais”. Por exemplo: ch: = make (chan int) go func () {for i: = 0; i <5; i ++ {CH <- i} Close (ch) // Tell Receiver No More Data} () para V: = RANGE CH {FMT.println (V)} Digite o modo de saída de tela cheia da tela cheia sem fechar (CH), o loop do intervalo esperaria para sempre. 5. A regra de responsabilidade que o remetente é responsável por fechar o canal; Nunca o receptor.Clos do lado do receptor pode causar pânico se o remetente tentar enviar depois. 6. Takeaways Key Um canal é como um tubo. Ele pode transportar dados ou apenas um sinal. Use chan <- e <-Chan para deixar claro o remetente/receptor. Feche um canal quando souber que não serão enviados mais dados, especialmente para os receptores de loop. O remetente possui a operação fechada. Os canais do Go não são apenas para enviar dados. Eles também são sobre coordenação. Pensar em termos de canais de dados versus canais de sinalização facilitou muito para mim decidir quando e como fechá -los.

Fonte

Publicar comentário

Você pode ter perdido